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