内核代码疑问

14 views
Skip to first unread message

兰鹏

unread,
Jun 21, 2009, 9:08:39 PM6/21/09
to 西邮操作系统课程论坛
104# ifndef likely
105# define likely(x) (__builtin_constant_p(x) ? !!(x) :
__branch_check__(x, 1))
106# endif
107# ifndef unlikely
108# define unlikely(x) (__builtin_constant_p(x) ? !!(x) :
__branch_check__(x, 0))
109# endif
110

以上代码来自2.6.29版本的/linux/include/linux/compiler.h
我是在LXR网站上看的,可是始终连接不到__builtin_constant_p(x)的定义和__branch_check__(x, 1)的定
义。
我想请问likely(x)和unlikely(x)是什么意思啊?
谢谢。

李则良

unread,
Jun 22, 2009, 3:50:05 AM6/22/09
to xiyouo...@googlegroups.com
2009/6/22 兰鹏 <lanpe...@gmail.com>:
__builtin_constant_p为gcc的内建函数,用于判断一个值是否为编译时常数,如果参数EXP 的值是常数,函数返回 1,否则返回 0。例如:
++++ include/asm-i386/bitops.h
249: #define test_bit(nr,addr) \
250: (__builtin_constant_p(nr) ? \
251: constant_test_bit((nr),(addr)) : \
252: variable_test_bit((nr),(addr)))
  很多计算或操作在参数为常数时有更优化的实现,在 GNU C
中用上面的方法可以根据参数是否为常数,只编译常数版本或非常数版本,这样既不失通用性,又能在参数是常数时编译出最优化的代码。直接在config.h中定义:
#define __builtin_constant_p(x) (0)
__branch_check__(x, 1)怎么会找不到呢:
http://lxr.linux.no/linux+v2.6.29/include/linux/compiler.h#L84
> 我想请问likely(x)和unlikely(x)是什么意思啊?
likely(x) 和unlikely(x)是用来对判断代码进行优化的,也就是说,如果这个判断被执行的几率很小时,可以使用unlikely(判断),编译器将在编译时对它进行相应的优化,这要涉及编译原理里的目标代码生成的时候jmp语句的放置问题了,likely相反。。
> 谢谢。
>
>
> >
>

--
不去想是否能成功,既然选择了远方,便只顾风雨兼程;不去想身后会不会袭来寒流,既然目标是地平线,留给世界的只能是背影。

李则良

unread,
Jun 22, 2009, 4:00:10 AM6/22/09
to xiyouo...@googlegroups.com
2009/6/22 李则良 <lizelia...@gmail.com>:

关于 likely(x) 和unlikely(x)推荐读一下这篇文章:
http://www.diybl.com/course/6_system/linux/Linuxjs/2007930/75397.html

Reply all
Reply to author
Forward
0 new messages