HERD--GCC宏

减少跳转语句失效时CPU等待取指令时间,提高CPU效率

使用__builtin_expect(EXP,N)

意思是EXP==N的概率很大

一般封装为LIKELY和UNLIKELY宏

#define LIKELY(x) __builtin_expect(!!(x),1) 很可能为真

#define UNLIKELY(x) __builtin_expect(!!(x),0) 很可能为假

编译器会利用编程人员做出的判断来生成高效代码

--------------------------------------------------------------------

__inline 关键字建议编译器在合理的情况下内联编译 C 或 C++ 函数。

__inline 语义与 C++ inline 关键字的语义完全相同。

__inline 是一个存储类限定符。 它不影响函数的类型。

格式:
inline _declarator; 
__inline _declarator; // Microsoft相关
__forceinline _declarator; // Microsoft相关

__inline与inline等同。inline和__inline通知编译器将该函数的内容拷贝一份放在调用函数的地方,这称之为内联。内联减少了函数调用的开销,但却增加了代码量。__forceinline关键字则是不基于编译器的性能和优化分析而依赖于程序员的判断进行内联,但它也不保证一定内敛,有些情况函数是肯定不能内敛的。要慎用__forceinline,不加考虑的使用它将会造成代码量的膨胀而只得到很小的性能回报,甚至造成性能下降。
1.当使用/clr编译器选项时,如果函数使用了安全属性,则不会进行内联。
2.inline关键字仅用于C++;__inline和__forceinline在C和C++中都可用。
3.类的成员函数如果是在类定义的同时定义的,那么它默认是inline的,否则也可以使用inline指定为内联的。
4.如果函数使用了__forceinline关键字,但实际没有进行内联,将给出level 1警告。

在以下情况中,编译器不进行函数内联,即使是使用__forceinline:
1.函数具有可变数目的参数。
2.通过指向该函数的函数指针进行调用。

-----------------------------------------------------------------

__attribute__机制

设置函数、变量、类型的属性

格式是__attribute__((attribute-list))

位置约束:放在声明的尾部,在";"之前。

对结构体共用体设置属性时,有六种属性:aligned(alignment)、packed、transparent_union、unused、deprecated、may_alias

对函数设置属性时,目前见到的有:always_inline

时间: 2024-11-08 19:45:40

HERD--GCC宏的相关文章

使用xcode的preprocess功能学习宏定义

C.C++和Objective-C都支持宏定义.宏在编译预处理过程中会进行代码替换.我们可以通过命令行非常容易就能的到一个源文件处理后的结果. #define kMax 100int main(int argc, char * argv[]) {     int a = 100;     if (a < kMax) {         a++;     }     else {         a = 0;     }     return 0;} 编译预处理命令: clang -E main.

又是正版!Win下ffmpeg源码调试分析二(Step into ffmpeg from Opencv for bugs in debug mode with MSVC)

最近工作忙一直没时间写,但是看看网络上这方面的资源确实少,很多都是linux的(我更爱unix,哈哈),而且很多是直接引入上一篇文章的编译结果来做的.对于使用opencv但是又老是被ffmpeg库坑害的朋友们,可能又爱又恨,毕竟用它处理和分析视频是第一选择,不仅是因为俩者配合使用方便,而且ffmpeg几乎囊括了我所知道的所有解编码器,但是正是因为这个导致了一些bug很难定位,所以有必要考虑一下如何快速定位你的ffmpeg bug. sorry,废话多了.首先给个思路: 1.使opencv 的hi

基于Linux下的GCC编译器的内部预宏定义与__attribute__属性

***************************************************************************************************************************** 作者:EasyWave                                                                                    时间:2015.02.20 类别:Linux应用-GCC编

gcc中预定义的宏__GNUC__

今天在看Linux系统编程这本书的代码的时候看到了__GNUC__,不太清楚这个宏所以去查了一下,以此记录.GNU C预定义了一系列的宏,这些宏都是以双下划线开始的,这里只讲一下__GNUC__  __GNUC_MINOR__ __GNUC_PATCHLEVEL__,其他GNU C的预定义宏可以到这里查看: https://gcc.gnu.org/onlinedocs/gcc-5.1.0/cpp/Common-Predefined-Macros.html#Common-Predefined-Ma

linux内核宏container_of前期准备之gcc扩展关键字typeof

typeof基本介绍 1 typeof(x) 这是它的使用方法,x可以是数据类型或者表达式.它的作用时期和sizeof类似,就是它是在编译器从高级语言(如C语言)翻译成汇编语言时起作用,这个很重要,稍后会解释. 当x是数据类型时,它和关键字typedef很相似,只不过typedef是要先定义再使用,而typeof则是可立即使用的,如下: 1 typedef int INT; 2 int main(int argc, const char *argv[]) 3 { 4 INT a; 5 typeo

gcc预置宏定义

通过以下命令可以查看gcc的内置宏定义 gcc -E -dM - </dev/null [email protected]>gcc -E -dM - </dev/null                                                                                #define __DBL_MIN_EXP__ (-1021) #define __FLT_MIN__ 1.17549435e-38F #define __CHA

gcc编译期打印宏的值

如果我们想知道一个宏的值应该怎么办? 要么在代码里加一句printf 要么在编译的时候gcc -E 第一种方法需要程序运行起来,颇为麻烦 第二种方法无法应付下面这些情况 比如宏的值等于sizeof(struct xxoo) 比如宏本身就是一个复杂的运算(((2U) << (((0+8)+8)+13)) | ((('W')) << (0+8)) | (((7)) << 0) | (((((sizeof(int) == sizeof(int[1]) && s

查看gcc编译的默认定义宏

http://blog.csdn.net/cywosp/article/details/10730931 gcc -posix -E -dM - </dev/null 因为我在移植代码到linux的时候,想统一用一个宏来放置我增加的linux代码,试了几下,总觉得“试”是比较蠢的办法,应该有更直接的办法.搜一把咯,搜到上面的链接. [email protected]:~/hero/dev_head/hp/hp_p$ gcc -posix -E -dM - </dev/null #define

查看GCC的内置宏定义

开发过程中我们常常需要使用宏定义.. 为了尽可能多的使用GCC为我们提供的特性,首先我们需要知道gcc提供了那些特性... gcc -dM -E - < /dev/null 没错,就这么一句话就可以搞定了... 原文地址:https://www.cnblogs.com/wlzy/p/9688221.html

GCC泛型宏

在JAVA和CPP这种OOP语言中,都有泛型类,在C语言可以用宏定义实现泛型函数. main.c 1 #include <stdio.h> 2 #define min(x, y) ({ 3 typeof(x) _min1 = (x); 4 typeof(y) _min2 = (y); 5 (void) (&_min1 == &_min2); 6 _min1 < _min2 ? _min1 : _min2;}) 7 8 int main(int argc, char **a