在学习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内嵌函数的更多相关文章

  1. Makefile所有内嵌函数

    一.文本处理函数以下是GNU make内嵌的文本(字符串)处理函数.1       $(subst FROM,TO,TEXT) 函数名称:字符串替换函数—subst. 函数功能:把字串“TEXT”中的 ...

  2. ARM GCC 内嵌(inline)汇编手册

    转自:http://blogold.chinaunix.net/u2/69404/showart_1922655.html ARM GCC 内嵌(inline)汇编手册 百度云:http://pan. ...

  3. ARM GCC 内嵌汇编手册

    转自:http://blogold.chinaunix.net/u2/69404/showart_1922655.html ARM GCC 内嵌(inline)汇编手册 关于这篇文档这篇文章是本人为方 ...

  4. Makefile学习(二)条件判断和内嵌函数

    第七章:Makefile的条件执行 条件语句可是是两个不同的变量.或者变量和常量值的比较: 7.1例子: 对变量“CC”进行判断,其值如果是“gcc ”那么在程序连接时使用库“libgnu.so”或者 ...

  5. ARM嵌入式开发中的GCC内联汇编__asm__

    在针对ARM体系结构的编程中,一般很难直接使用C语言产生操作协处理器的相关代码,因此使用汇编语言来实现就成为了唯一的选择.但如果完全通过汇编代码实现,又会过于复杂.难以调试.因此,C语言内嵌汇编的方式 ...

  6. Makefile---make内嵌函数及make命令显示 (九)

    原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ 这一节我们讲一下make的函数,在之前的章节已经讲到了几个函数:wildcard.patsubs ...

  7. 3.MVC框架开发(Razor内嵌函数)

    1.建立没有返回值的Razor内嵌函数(但是能直接输出内容) 必须以@符号开头,没有返回值但能直接输出内容,比如: @helper showTitle(string strTitle){ ){ @(s ...

  8. 函数:内嵌函数和闭包 - 零基础入门学习Python020

    函数:内嵌函数和闭包 让编程改变世界 Change the world by program 内嵌函数和闭包 接下来这两节课我们谈的话题可能会"比较高级",所以如果是零基础的朋友, ...

  9. Python3基础 内嵌函数 简单示例

    镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...

  10. cpp 内嵌函数(lambda,struct)

    auto testFun = [this](int t)->void{ } []()->反回值{ } []内传入函数运行环境所用变量 ()内传入变量 捕捉块 lambda表达式的方括号部分 ...

随机推荐

  1. Jmeter:随机类函数

    一.__Random 功能介绍:计算范围内的随机数 ${__Random(参数 1,参数 2,参数 3)} 参数 1:开始数字,包括在内 参数 2:结束数字,包括在内 参数 3:注册变量名称  二._ ...

  2. 002 jmeter入门级写脚本及参数化

    1.jmeter入门脚本 步骤分析:测试计划(项目名称)-线程组(业务流程)-http请求(接口名称)-察看结果树 编写脚本四要素:测试计划.至少有一个线程组.至少有一个取样器.必须要有监听器 测试计 ...

  3. python_test_5001_Moudle_pandas

    import pandas as pd import numpy as np from lib_001_decorator_log_funcname import decorator_log_func ...

  4. 牛客java基础语法在线编程-知识点小结(待完善)

    知识点小结 一.输入输出 Scanner类 Scanner类在java.util包下,导包格式如下: import java.util.Scanner; 使用示例: import java.util. ...

  5. ASPICE的实践

    ASPICE这种规范文件如果严格遵守,那么投入产出比是比较小的. 但是其中的思想是很好的,比如对需求的管理.讲究双向可追溯. 但是也是有很多需要慎重的,比如对component和unit的区分太过明显 ...

  6. 有null值的子查询,子查询加排序,速度大幅提升

    意外发现,如果子查询结果有大量null值,加上一个排序,最后查询速度飞起

  7. Centos7 安装Mysql8 主从数据库

    前提条件 准备了两台虚拟机 mysql-master 192.168.30.199, mysql-slave 192.168.30.198 1:官网下载并安装Mysql8 1:安装mysql 1.1: ...

  8. AVL tree rotate

    AVL tree single rotate /** * Rotate binary tree node with left child. * For AVL trees, this is a sin ...

  9. Mule获取Http参数

  10. python 中的 re.compile 函数

    python 中的 re.compile 函数   正则表达式功能十分强大. "有些人面临一个问题时会想:'我知道,可以用正则表达式来解决这个问题.'于是现在他们就有两个问题了"- ...