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

 

posted @ 2020-07-29 22:27  馒头233  阅读(131)  评论(0)    收藏  举报