在学习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

最新文章

  1. (转)sl简单自定义win窗体控件
  2. Flash相册-------3D旋转应用
  3. 用自然语言的角度理解JavaScript中的this关键字
  4. [tp3.2.1]sql查询语句(一)
  5. asp.net mvc上传头像加剪裁功能介绍
  6. JQuery插件,傻傻分不清!
  7. 指尖上的电商---(2)Solr全文搜索引擎的准备工作
  8. JavaScript递归
  9. 我的第一个python web开发框架(35)——权限数据库结构设计
  10. 【转载】Sikuli安装及使用——基于图像识别自动化工具
  11. webshell导致项目崩溃
  12. ASP.NET Core 1.0、ASP.NET MVC Core 1.0和Entity Framework Core 1.0
  13. docker从容器中怎么访问宿主机
  14. Tomcat-servlet基础
  15. CentOS下双网卡绑定-bond0
  16. 【Pyton】【小甲鱼】永久存储:腌制一缸美味的泡菜
  17. ARP命令详解
  18. 排序算法之直接插入排序Java实现
  19. asp.net 导出 Excel 身份证格式显示格式问题
  20. 架构师养成记--33.Redis哨兵、redis简单事务

热门文章

  1. fetch,axios简介与语法
  2. ES-增删改查
  3. 达芬奇18.1.2安装包下载+软件详细破解安装教程(Win&amp;Mac)
  4. libnode使用addon
  5. 解决sqlplus中方向键和退格键乱码问题
  6. 从零搭建hadoop集群之节点间免密登录
  7. springsecurity maven 打包后,404错误。maven 打包后,加载内置的xml文件
  8. gitlab+jenkins配置自动触发构建
  9. 看K线学炒股(8.9)
  10. K8S实现不同节点POD获取不同IP