最近在拜读一个项目源代码的过程中,发现了一个有意思的GCC特性,现将这个特性总结如下:
开发人员在开发服务的过程中,可以根据业务逻辑的特性来判断当前的条件语句被执行的概率情况,经常被执行到的代码片段可以紧邻顺序执行的代码片段后边,偶尔被执行到的条件代码片段被放到其他代码片段,从而减少代码在顺序执行过程中的代码上下文的跳转次数,达到提高程序执行效率的目的。这种方式的优化,需要严重的依赖于业务逻辑所处的环境,对于GCC等编译器来将,显然是无法根据业务逻辑自动做出性能优化的,最直接的一种方法就是:由开发人员告诉编译器,这部分代码片段被执行的概率比较高,可以进行优化。为此,诞生了两个针对进行这种优化的宏定义,分别是:likely和unlikeyly,经常被用于的使用场景为:
if (likely(value)){
//do thing1
}else{
//do thing2
}
if (unlikely(value)){
//do thing1
}else{
// do thing2
}
其实,无论是if(likely(value))还是if(unlikely(value)),从代码阅读的角度与if(value)是完全一样的,区别点在于编译器根据三种情况所作出的优化措施不同;
likely,是通知编译器if (true)被执行的概率比较高;
unlikely,是通知编译器if(false)被执行的概率比较高;
继续刨根问底的翻查这两个宏的实现:
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
本质上是通过__builtin_expect函数来通知编译器如何来进行优化
分享到:
相关推荐
cygwin上升级GCC,目前GCC的版本为 3.4.4。升级为:4.0.0.
不太可能 GCC 分支预测宏。 安装 使用安装: $ clib install clibs/file 应用程序接口 likely (expr) unlikely(expr)
读取4路mic的文件,然后经过gcc——phat处理,形成波束,然后加权之后写入文件。实测该算法降噪的效果还可以.另附一篇降噪文档,比较实用
关于目前Linux下最常用的C语言编译器是GCC(GNU Compiler Collection),它是GNU项目中符合ANSI标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。
有关GCC入门的书籍,很好用。 希望能够对大家学习GCC有些帮助
熟悉并提高在GCC环境下编程和GCC编程软件的应用,在嵌入下面最有用!
GCC for Win32开发环境介绍 第一章 在视窗操作系统下的GCC 第一节 GCC家族概览 ...第三章 GCC粗探——GCC的组成与附加参数 第一节 GCC的家族成员 第二节 GCC的常用编译参数 第三节 如何写一个简单的Makefile
gcc和g++的辅助工具,可以批量编译程序
一、Linux 平台 gcc 和动态共享库的基础知识 1)GNU gcc 的编译工具用法 2)动态共享库怎么使用 3)关于 Linux 的动态共享库的设置 二、GCC——C 程序是如何编译成的 三、GCC 使用详解
共两个部分GccG++ rpm安装包.part1.rar 和 GccG++ rpm安装包.part2.rar 包括linux上安装GCC或G++的... —————————————– 软件包依赖性的问题,用nodeps属性一定能装上 rpm -Uvh *.rpm –nodeps –force
从mini安装版centos7.5提取出来的gcc和gcc-c++安装包,下载后放到服务器解压,并cd到该目录,执行 rpm -Uvh *.rpm,安装完成后,运行gcc -v,g++ -v,会出现版本信息,则完成
gcc、gcc++ 离线安装包
tar -xvf tar -xvf gcc-9.3.0_deb.tar 解压 解压后执行./install.sh libc6_2.31 manpages-dev_5.05 binutils-common_2.34 linux-libc-dev_5.4.0 libctf-nobfd0_2.34 gcc-10-base_10 libgomp1_10 libquadmath0 libmpc...
详细介绍了linux下gcc编译器使用时设计到的头文件和库文件链接问题
gcc各版本文档,具体包括: gcc11_2、gcc10_3、gcc9_4、gcc8_5、gcc7_5、gcc6_5、gcc5_5、gcc4_9_4、gcc4_8_5、gcc4_7_4、gcc4_6_4、gcc4_5_4、gcc4_4_7、gcc4_3_6、gcc4_2_4、gcc4_1_2、gcc4_0_4、gcc3_4_6
gcc4.4.3及dll268。主要是GCC的安装文件。一共两部分,这是第二部分。
gcc manual gcc手册 gcc manual gcc手册 gcc manual gcc手册 gcc manual gcc手册
离线安装GCC与GCC-C++
gcc 8.3.1离线安装资源包和依赖包