libev中的__attribute__优化
在学习libev的过程中,遇到了大量的__attribute__优化方式,此文章将它们做一个汇总和介绍,并会持续更新
1、unused:使编译器忽略未使用的函数或者变量
源码如下
1 //判断如果gcc的版本号大于3.1或者clang的版本号大于2.8 则使用该功能 2 //否则使用 3 #if ECB_GCC_VERSION(3,1) || ECB_CLANG_VERSION(2,8) 4 #define ecb_attribute(attrlist) __attribute__ (attrlist) 5 #else 6 #define ecb_attribute(attrlist) 7 #endif 8 //封装__attribute__(unused) 9 #define ecb_unused ecb_attribute ((__unused__)) 10 //代码中的使用 11 int ecb_unused ocur_ = (cur); 12 //可以看到,如果编译器符合要求,那么上述代码将会扩展为 13 //int __attribute__((unused)) ocur_ = (cur); 14 //否则就会是int ocur_ = (cur);
测试如下:
1 #include <stdio.h> 2 3 int main(){ 4 int __attribute__((unused)) a = 0; 5 int b = 0; 6 }
编译结果如下:
可以看到,未使用的a没有报出编译警告,而b则报出了编译警告。
2、 __noinline__:强制编译器不内联某个函数
源码如下
//判断如果gcc的版本号大于3.1或者clang的版本号大于2.8 则使用该功能 //否则不使用 #if ECB_GCC_VERSION(3,1) || ECB_CLANG_VERSION(2,8) #define ecb_attribute(attrlist) __attribute__ (attrlist) #else #define ecb_attribute(attrlist) #endif //使用编译器特性来强制不内联某个函数 //如果是微软编译器,并且版本大于等于8.0使用第一种方法,否则使用第二种方法 #if _MSC_VER >= 1400 #define ecb_noinline __declspec (noinline) #else #define ecb_noinline ecb_attribute ((__noinline__)) #endif //对以上的一个封装 #define noinline ecb_noinline
3、__hot__ __cold__ __artificial__:hot表示该函数比较热门,在编译链接时会对其进行优化。cold相反
源码
#if ECB_GCC_VERSION(4,3) #define ecb_artificial ecb_attribute ((__artificial__)) #define ecb_hot ecb_attribute ((__hot__)) #define ecb_cold ecb_attribute ((__cold__)) #else #define ecb_artificial #define ecb_hot #define ecb_cold #endif