libev中的gcc内嵌函数
在学习libev的过程中,遇到了大量的gcc内嵌函数,大多是为了提升性能而使用的,这里做一个汇总和介绍,并会持续更新
1、__builtin_expect:该函数是gcc引入的,为的是让程序员讲最有可能执行的分支告诉编译器,达到性能提升的效果
源码:
1 //判断GNU版本号,如果不是gcc编译器,则不使用__builtin_expect函数
2 //否则如果主版本号大于major或者主版本号等于major但是次版本号大于minor则返回真 否则返回假
3 //__GNUC__ 、__GNUC_MINOR__ 、__GNUC_PATCHLEVEL__分别代表gcc的主版本号,次版本号,修正版本号。
4 //如果你的gcc版本为 6.7.8那么上述三个值依次为6 7 8 注意__GNUC_PATCHLEVEL__宏是gcc3.0后才出现的
5 #if !defined __GNUC_MINOR__ || defined __INTEL_COMPILER || defined __SUNPRO_C || defined __SUNPRO_CC || defined __llvm__ || defined __clang__
6 #define ECB_GCC_VERSION(major,minor) 0
7 #else
8 #define ECB_GCC_VERSION(major,minor) (__GNUC__ > (major) || (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor)))
9 #endif
10 //判断clang编译器是否内置了某个功能
11 #if __clang__ && defined __has_builtin
12 #define ECB_CLANG_BUILTIN(x) __has_builtin (x)
13 #else
14 #define ECB_CLANG_BUILTIN(x) 0
15 #endif
16 //如果gcc版本号大于3.1,或者clang编译器内置了__builtin_expect,则使用该函数
17 #if ECB_GCC_VERSION(3,1) || ECB_CLANG_BUILTIN(__builtin_expect)
18 #define ecb_expect(expr,value) __builtin_expect ((expr),(value))
19 #else
20 //否则直接使用表达式判断
21 #define ecb_expect(expr,value) (expr)
22 #endif
23 //对__builtin_expect使用的一层封装
24 #define ecb_expect_false(expr) ecb_expect (!!(expr), 0)
25 //再次封装该函数,使命名看起来更加简单直观
26 #define expect_false(cond) ecb_expect_false (cond)
27 //终于到了逻辑层的使用
28 if (expect_false ((cnt) > (cur)))
作者的注释也是非常有趣,贴一段在判断编译器版本号时的注释,大意是骂"白痴"编译器作者实现的功能有限
1 /* many compilers define _GNUC_ to some versions but then only implement
2 * what their idiot authors think are the "more important" extensions,
3 * causing enormous grief in return for some better fake benchmark numbers.
4 * or so.
5 * we try to detect these and simply assume they are not gcc - if they have
6 * an issue with that they should have done it right in the first place.
7 */
libev中的gcc内嵌函数的更多相关文章
- Makefile所有内嵌函数
一.文本处理函数以下是GNU make内嵌的文本(字符串)处理函数.1 $(subst FROM,TO,TEXT) 函数名称:字符串替换函数—subst. 函数功能:把字串“TEXT”中的 ...
- ARM GCC 内嵌(inline)汇编手册
转自:http://blogold.chinaunix.net/u2/69404/showart_1922655.html ARM GCC 内嵌(inline)汇编手册 百度云:http://pan. ...
- ARM GCC 内嵌汇编手册
转自:http://blogold.chinaunix.net/u2/69404/showart_1922655.html ARM GCC 内嵌(inline)汇编手册 关于这篇文档这篇文章是本人为方 ...
- Makefile学习(二)条件判断和内嵌函数
第七章:Makefile的条件执行 条件语句可是是两个不同的变量.或者变量和常量值的比较: 7.1例子: 对变量“CC”进行判断,其值如果是“gcc ”那么在程序连接时使用库“libgnu.so”或者 ...
- ARM嵌入式开发中的GCC内联汇编__asm__
在针对ARM体系结构的编程中,一般很难直接使用C语言产生操作协处理器的相关代码,因此使用汇编语言来实现就成为了唯一的选择.但如果完全通过汇编代码实现,又会过于复杂.难以调试.因此,C语言内嵌汇编的方式 ...
- Makefile---make内嵌函数及make命令显示 (九)
原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ 这一节我们讲一下make的函数,在之前的章节已经讲到了几个函数:wildcard.patsubs ...
- 3.MVC框架开发(Razor内嵌函数)
1.建立没有返回值的Razor内嵌函数(但是能直接输出内容) 必须以@符号开头,没有返回值但能直接输出内容,比如: @helper showTitle(string strTitle){ ){ @(s ...
- 函数:内嵌函数和闭包 - 零基础入门学习Python020
函数:内嵌函数和闭包 让编程改变世界 Change the world by program 内嵌函数和闭包 接下来这两节课我们谈的话题可能会"比较高级",所以如果是零基础的朋友, ...
- Python3基础 内嵌函数 简单示例
镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...
- cpp 内嵌函数(lambda,struct)
auto testFun = [this](int t)->void{ } []()->反回值{ } []内传入函数运行环境所用变量 ()内传入变量 捕捉块 lambda表达式的方括号部分 ...
随机推荐
- docker-compose重新启动单个容器
这很简单:使用命令: docker-compose restart worker 您可以设置在杀死容器之前等待停止的时间(以秒为单位) docker-compose restart -t 30 wor ...
- 服务器consul与本地服务健康检查不通问题解决
(125条消息) 服务器consul与本地服务健康检查不通问题解决_向往鸟的博客-CSDN博客_consul健康检查失败 .MathJax, .MathJax_Message, .MathJax_Pr ...
- java异常信息打印
如果你不仅想在日志中查看异常信息,也想把异常信息保存起来作为数据查看,那么你可以这样做 public void printException(Exception e) { ByteArrayOutpu ...
- python图片转base64、base64转图片
#图片转base64 import base64 with open("./1.png","rb") as f:#转为二进制格式 base64_data = b ...
- JAVA学习笔记-06
多态:可以理解为事物存在的多种体现形态 1.多态的基本体现 父类的引用指向了自己的子类对象 父类的引用也可以接收自己的子类对象 2.多态的前提 必须是类与类之间有关系,要么继承,要么实现 通常还有一个 ...
- ffmpeg 截取视频
ffmpeg -ss 00:00:03 -t 22 -i output20230301.mp4 output20230301_0.mp4 -ss:开始时间 -t:持续时间 -i:输入 接着是输出
- jdk 13 添加 jre
问题: 安装 jdk 13 版本后发现没有 jre . 解决方法: 1.进入 jdk 安装目录(如:D:\Program\Java\jdk-13.0.2\) 2.在 jdk 安装目录打开命令行,输入以 ...
- 如何理解JavaScript中常用的4种排序算法?
如何理解JavaScript中常用的4种排序算法? 冒泡排序 冒泡排序是我们在编程算法中,算是比较常用的排序算法之一,在学习阶段,也是最需要接触理解的算法,所以我们放在第一个来学习. 算法介绍: ...
- 【STM32】SYSCLK配置|学习笔记
一.RCC原理 所有stm32的外设都是挂载在相应的时钟上的,如下 挂载在AHB上的外设 挂载在APB1上的 APB2上的 所以RCC很重要,特别像TIM这种对时钟特别敏感的外设就必须把SYSCLK确 ...
- JavaScript 基础学习(二)
JavaScript 基础学习(二) instanceof方法: var s = "hello"; var i = 8; //typeof 只能判断基本数据类型 alert(typ ...