likely()和unlikely()的用法
2021-03-03 本文已影响0人
潘雪雯
#ifndef likely
#define likely(x) __builtin_expect(!!(x), 1)//表示x的值为真的可能性更大
#endif /* likely */
#ifndef unlikely
#define unlikely(x) __builtin_expect(!!(x), 0) //表示x的值为假的可能性更大
#endif /* unlikely */
__builtin_expect()是GCC提供给程序员使用的,目的是将"分支转移"的信息提供给编译器,这样编译器可以对代码进行优化,以减少指令跳转带来的性能下降。
__builtin_expect(!!(x), 1)表示x的值为1的可能性更大
__builtin_expect(!!(x), 0)表示x的值为0的可能性更大
举例:
下面的代码中gcc编译的指令会预先读取y=-1这条指令,适合x的值大于0的概率比较小的情况。如果x的值大部分情况下是大于0的,就应该用likely(x>0),这样编译出的指令是预先读取y=1这条指令,这样系统在运行时会减少重新取指。
int x = -1, y;
if(unlikely(x > 0))
y = 1;
else
y = -1;
2,ip地址在计算机中的存储形式为uint32_t:
10.107.39.24 --> 0x0a6b2718
inet_aton()函数将一个字符串IP地址"点地址(127.0.0.1)" 转换为该地址数值的整数(一个32位的网络序列IP地址)。如果这个函数成功,函数的返回值非零,如果输入地址不正确则会返回零。使用这个函数并没有错误码存放在errno中,所以它的值会被忽略。