减少跳转语句失效时CPU等待取指令时间,提高CPU效率
使用__builtin_expect(EXP,N)
意思是EXP==N的概率很大
一般封装为LIKELY和UNLIKELY宏
#define LIKELY(x) __builtin_expect(!!(x),1) 很可能为真
#define UNLIKELY(x) __builtin_expect(!!(x),0) 很可能为假
编译器会利用编程人员做出的判断来生成高效代码
--------------------------------------------------------------------
__inline
关键字建议编译器在合理的情况下内联编译 C 或 C++ 函数。
__inline
语义与 C++ inline 关键字的语义完全相同。
__inline
是一个存储类限定符。 它不影响函数的类型。
格式:
inline _declarator;
__inline _declarator; // Microsoft相关
__forceinline _declarator; // Microsoft相关
__inline与inline等同。inline和__inline通知编译器将该函数的内容拷贝一份放在调用函数的地方,这称之为内联。内联减少了函数调用的开销,但却增加了代码量。__forceinline关键字则是不基于编译器的性能和优化分析而依赖于程序员的判断进行内联,但它也不保证一定内敛,有些情况函数是肯定不能内敛的。要慎用__forceinline,不加考虑的使用它将会造成代码量的膨胀而只得到很小的性能回报,甚至造成性能下降。
1.当使用/clr编译器选项时,如果函数使用了安全属性,则不会进行内联。
2.inline关键字仅用于C++;__inline和__forceinline在C和C++中都可用。
3.类的成员函数如果是在类定义的同时定义的,那么它默认是inline的,否则也可以使用inline指定为内联的。
4.如果函数使用了__forceinline关键字,但实际没有进行内联,将给出level 1警告。
在以下情况中,编译器不进行函数内联,即使是使用__forceinline:
1.函数具有可变数目的参数。
2.通过指向该函数的函数指针进行调用。
-----------------------------------------------------------------
__attribute__机制
设置函数、变量、类型的属性
格式是__attribute__((attribute-list))
位置约束:放在声明的尾部,在";"之前。
对结构体共用体设置属性时,有六种属性:aligned(alignment)、packed、transparent_union、unused、deprecated、may_alias
对函数设置属性时,目前见到的有:always_inline