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表达式的方括号部分 ...
随机推荐
- shell_Day07
函数: 函数介绍function 为了避免代码重复使用,我们一般通过函数编写代码块,而这一个代码块用来实现某种功能,这个功能在后面的代码中,会重复调用: 函数的语法格式 function check_ ...
- Java基础学习:9、访问修饰符
Java提供四种访问控制修饰符,用于控制方法和属性(成员变量)的访问权限(范围). 注意事项: 1.修饰符可以访问类中的属性.成员方法.以及类. 2.只用默认修饰符.public可以修饰类. 3.成员 ...
- ctfshow web入门 命令执行 web29-36
29-36 全是基于get传参执行 eval() 函数,均采用黑名单匹配,不同点在于黑名单的变化 web29 1 error_reporting(0); 2 if(isset($_GET['c'])) ...
- SpringBoot中SpringMVC异常处理机制
声明 源码基于SpringBoot 2.3.12 前置知识 Tomcat异常处理机制 使用例子 原理简要介绍 先来看下Spring Boot中默认的处理行为,如果DispatcherServlet执行 ...
- Using Yocto Project with BeagleBone Black 英文版、Using Yocto Project with BeagleBone Black中文版
Using Yocto Project with BeagleBone Black 手册英文版.中文版 https://market.m.taobao.com/app/idleFish-F2e/wi ...
- 初识Node
Node的定义:一个搭建在Chrome JavaScript运行时上的平台,用于构建高速.可伸缩的网络程序. Node构建与JS之上,在服务器端,Node使用V8虚拟机,执行的是本地机器码,省去了 ...
- (K8s学习笔记四)常用命令实例
1.显示Pod的更多信息 kubectl get pod <pod-name> -o wide kubectl get pods -show-all # 查看已经停止的Pod 2.以yam ...
- select multiple 浏览器兼容
select multiple 时一般是设置 height <select multiple="multiple" style="height:87px;" ...
- Java 日期类 处理
原始方案:SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-DD"); //线程不安全类,最好不要用了,替代方案: Date ...
- C/C++/中宏特殊字符的含义及用法总结(“#”、“##”、"#@"、“\”等等)
在C/C++中,宏定义是由define完成的,宏定义中有几种常见的特殊字符需要我们了解,常用的特殊字符有以下几种: #:在宏展开的时候会将#后面的参数替换成字符串: 字符串化##:将前后两个的单词拼接 ...