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语法5-判断语句、循环语句、函数
一.判断语句 if-then形式类似于C/C++中的if-else语句. 1.单层if命令格式:if conditionthen 语句1 语句2 ...fi 2.单层if-else命 ...
- idea启动项目,报java.lang.OutOfMemoryError: PermGen space 和启动项目很慢的问题解决
启动一个老的项目,报错,查是内存溢出 进入 VM options 加上 -Xms256m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m 在 ...
- 小白之Python-基础中的基础04
继续.. ------------------------华丽的分界线----------------------------- Python-基础中的基础04 --之方法 格式:对象.方法() 1. ...
- python+ffmpeg,批量转换手机中的m3u8文件
前段时间,有朋友找我帮忙,自述其手机上使用UC浏览器,缓存的电影有近千个,手机存储不够了,想把这些电影转存到PC机上,并且将其转换为Mp4文件.小事情,安排! 一.分析情况,确定方案. 首先连接手机, ...
- ubuntu常用操作
Ubuntu22.04 server 创建随操作系统自动启动: 创建rc-local.service cp /lib/systemd/system/rc.-local.service /etc/sys ...
- JSP图书管理系统
allbook.jsp pageEncoding="UTF-8"%> <%@ page import = "java.util.*" %> & ...
- 学习-Vue3-绑定内联样式
<template> <div> <!-- 绑定内联样式--绑定对象 --> <!-- <div :style="{color: active ...
- jmeter压测dubbo接口,参数为dto时如何写传参及有错误时的分析思路
一.传参 1. 无论dubbo接口传参是否为dto,所有参数都是在args的tab传进去的. 2. 如果dto中有自定义对象,paramType为自定义dto名,paramValue为其他参数组成的j ...
- Oracle虚拟机与主机共享设置
VM中linux与主机的文件共享 1.打开 Oracle VM VirtualBox 点击 [控制] [设置] [数据空间] 添加你所希望共享的文件夹
- centos7的密码安全策略加固
centos7操作系统 在CentOS 7上实现密码复杂度策略设置 一.使用login.defs文件 解析:/etc/login.defs 是设置新建用户帐号限制的文件.该文件里的配置对root用户无 ...