首页 > 编程知识 正文

gcc builtin,gcb函数c语言

时间:2023-05-05 21:31:42 阅读:182151 作者:2517

GCC提供了一系列builtin函数,这些函数提供了简单快捷的功能,使程序的编写更容易,并使用了许多builtin函数来优化编译结果。 这些函数使用“__builtin_”作为函数名称的前缀。

许多c标准库函数都有相应的GCC builtin函数。 例如,strcpy ()具有相应的__builtin_strcpy )内置函数。

介绍builtin函数及其作用。

33558www.Sina.com/:x:返回x的最后一个1的比特从后向前,例如__Builtin_FFS(0x789 )=1,__Builtin_FFS )0x788c )=3 因此,__Builtin_FFS(x )- 1是x的最后一个位为1的位置。

__builtin_ffs(x):x中的1的个数。

__builtin_popcount(x):x末尾0的个数。 如果x=0,则不定义结果。

__builtin_ctz(x):x导程0的个数。 如果x=0,则不定义结果。

在上面的宏中,x都是unsigned int类型,传递给signed或char类型时,会强制转换为unsigned int。

__builtin_clz(x):x中1的奇偶校验。

__builtin_parity(x):当前函数的第n个调用方的地址。 __builtin_return_address(0)使用得最多。 也就是获取当前函数的调用方的地址。 请注意,此函数的实现与体系结构相关,有些体系结构只实现了n=0的返回值。

uint 16 _ t _ _ builtin _ bswap 16 (uint 16 _ tx ) ) ) ) ) ) ) ) ) 16 _ t _ builtin _ bswap 16 (uint 16 _ tx ) ) ) )

__builtin_return_address(n)) :按字节反转x,返回反转后的结果。

uint32_t __builtin_bswap32 (uint32_t x:在使用地址addr的值之前手动预取数据,以减少读取延迟并提高性能,但此函数还需要CPU支持。 此函数可以有三个参数,指示要预取的数据的地址。 第一个参数addr可以设置为0或1。 1向地址addr进行写入,0进行读取。 第三个参数是0-3。 0意味着不在乎时间的局部性,取addr的值后不需要留在cache中。 1、2、3意味着时间的局部性

33558 www.Sina.com/:判断exp在编译时是否为常数,如果exp为常数则返回1,否则返回0。 如果exp是常数,则可以在代码中进行优化以降低exp处理的复杂性。

33558 www.Sina.com/:判断type2和type2是否为相同的数据类型,如果相同则返回1,否则返回0。 此函数不区分修饰符,如const/volatile。 这意味着int和const int被视为同一类型。

#definefoo(x )

()。

typeof(x ) tmp=(x ) x;

if (_ builtin _ types _ compatible _ p (type of (x ),int ) ) ) ) ) ) ) ) ) 65

//do something.

else

//do something.

tmp;

() )

__builtin_prefetch (const void *addr, ...):用于引导gcc进行条件分支预测。 在某个指令正在执行的时候,通过流水线的作用,CPU能够完成下一个指令的读取,这样可以提高CPU的利用率。 在执行一个条件分支指令时,CPU也将预先移除一个执行。 但是,如果条件分支跳转到其他指令,则该CPU预取的下一个指令将被浪费,从而导致流水线效率降低。 内核中的likely (和unlikely ) )由__builtin_expect实现。

__Builtin_expect(longexp,long c )函数通过优化程序编译的指令序列,使指令尽可能按顺序执行,提高了CPU预取指令的准确性。 该函数的第二个参数c取0和1,

例如:

if(_Builtin_expect(x,0 ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )。

foo (;

因为表示x的值在大多数情况下为0,所以执行foo ()函数的机会很少。 gcc不需要将foo (函数的汇编指令紧邻if条件跳转指令。

因为第二个参数只能是整数,所以如果要确定指针或字符串,可以写如下:

if(_Builtin_expect(ptr!=NULL,1 )

foo(ptr );

因为ptr通常表示不为NULL,所以foo函数执行的概率很高,gcc将foo函数的汇编指令放在紧邻if跳转的位置。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。