关于Linux Kernel中的宏定义likely和unlikely
转自http://blog.163.com/ericxia_gnikam/blog/static/969208792008102545614453/
在Linux kernel的源代码中,经常能见到if(likely(x))或if(unlikely(x))之类的用法,其确切含义需要说明一下,以便更好的理解kernel的源代码。
likely与unlikely这两个宏在linux/compiler.h中的定义如下:
#define likely(x) __builtin_expect(!!(x),1)
#define unlikely(x) __builtin_expect(!!(x),0)
很明显,需要先弄清楚这个__builtin_expect()函数的意义。
__builtin_expect()是gcc的一个内建函数,其原型如下:
long __builtin_expect (long exp, long c);
记住该函数由GCC本身提供,用于优化代码。只中参数exp为任一表达式,c必须为常量值,其意义是在exp==c时,该函数返回非0值,意即希望exp==c。
回到likely和unlikely,likely实际是希望表达式x==1,即表达式x成立,并且在代码实际执行中,表达式x在绝大多数情况下是成立的,相反,unlikely是希望表达式在绝大多数情况下不成立,
如果有下列代码:
if(unlikely(a > b) {
foo();
}
这段代码的意思是,在绝大多数情况下a > b这个表达式是不成立的,不成立时执行函数foo().
另外有一点要注意的是,由于likely定义时用的常量是1,unlikely用的常量是0,这正好符合c/c++语言中bool变量的实际值,而_builtin_expect()函数对exp与c进行严格相等的比较的,
因此使用likely和unlikely时,其参数应该只使用逻辑表达式,因为逻辑表达式的值只有0或1。除非真要判断某个变量的值是1或0时,才会将其它类型的参数传给likely或unlikely。这一点可能很多人会不小心用错。
使用这两个宏定义的好处是优化条件判断
相关文档:
例一:发送Signaling Packet:
Signaling Command是2个Bluetooth实体之间的L2CAP层命令传输。所以得Signaling Command使用CID 0x0001.
多个Command可以在一个C-frame(control frame)中发送。
如果要直接发送Signaling Command.需要建立SOCK_RAW类型的L2CAP连接Socket。这样才有机会自己填充Command Code,Identi ......
//videoserver
#!/bin/bash
#
# videoserver
#
# chkconfig: 3456 11 91
# description: videoserver
# Source function library.
. /etc/rc.d/init.d/functions
prog="videoserver"
start() {
# Start daemons.
echo -n $"Starting $prog: "
/video/videoserver/recordvideosvr /video/videoserver ......
MYSQL定期备份是一项重要的工作,但人工操作太繁琐,也难避免有所疏漏,使用下
面的方法即可让系统定期备份数据。
1、创建备份文件夹
#cd /www
#makedir backup
2、编写运行脚本
#vi autobackup
写入以下内容:
filename=`date +%Y%m%d`
mysql_bin_dir/mysqldump –opt da ......
作者:
北南南北,正在增加中... ... 需要您的参与;
来自:
LinuxSir.Org
简介:
本文只是讲一讲我们最常用的Linux与Windows共享文件,主要是为新手指一指路。如何建立最简单的Samba服务器,并讲述遇到问题应该从何处寻找解决方案;正在更新之中,希望您的参加 ... ... 谢谢;
目录
0.1 查看文件 ......