gcc 内建函数

阅读数:310 评论数:0

跳转到新版页面

分类

C/C++

正文

内建函数就是编译器内部实现的函数,它们随时跟着gcc升级而变化,所以不推荐普遍的使用。使用内建函数更高效,因为它们大多以inline方式编译或者针对特定平台进行优化。

C标准库中的函数对应的内建函数有两种形式,一种是有__builtin_前缀,另一种是没有这个前缀。当一个内建函数调用但无法体现高效时,gcc会不使用这个内联函数而选择库函数。

内建函数可以直接使用,无须像标准库函数那样,要#include对应的头文件才能使用。

主要用途

(1)用来处理变长参数列表

(2)用来处理程序运行异常

(3)程序的编译优化、性能优化

(4)查看函数运行中的底层信息、堆栈信息等

(5)C标准库函数的内建版本

常用内建函数

1、__builtin_return_address(LEVEL)

level为0返回当前函数的返回地址

1返回当前函数调用者的返回地址

2返回当前函数调用者的调用者的返回地址

2、__builtin_frame_address(LEVEL)

在函数调用过程中,还有一个“栈帧”的概念。函数每调用一次,都会将当前函数的现场(返回地址、寄存器等)保存在栈中,每一层函数调用都会将各自的现场信息都保存在各自的栈中。这个栈也就是当前函数的栈帧,每一个栈帧有起始地址和结束地址,表示当前函数的堆栈信息。多层函数调用就会有多个栈帧,每个栈帧里会保存上一层栈帧的起始地址,这样各个栈帧就形成了一个调用链。很多调试器、GDB、包括我们的这个内建函数,其实都是通过回溯函数栈帧调用链来获取函数底层的各种信息的。比如,返回地址 i、调用关系等。在 ARM 系统中,使用 FP 和 SP 这两个寄存器,分别指向当前函数栈帧的起始地址和结束地址。当函数继续调用或者返回,这两个寄存器的值也会发生变化,总是指向当前函数栈帧的起始地址和结束地址。

0查看当前函数的栈帧地址

1查看当前函数调用者的栈帧地址

3、C标准库的内建函数

在 GNU C 编译器内部,实现了一些和 C 标准库函数类似的内建函数。这些函数跟 C 标准库函数功能相似,函数名也相同,只是在前面加了一个前缀 __builtin_。

(1)内存相关:memcpy, memset, memcmp

(2)数学函数:log, cos, abs, exp

(3)字符串处理函数:strcat , strcmp , strcpy ,strlen

(4)打印函数:printf, scanf, putchar, puts

4、__builtin_constant_p(n)

主要用来判断参数n在编译时是否为常量,是常量的话,函数返回1;否则返回0。

5、__builtin_expect(exp,c)

这个函数的意义主要就是告诉编译器:参数exp的值为c的可能性很大,然后编译器可能就会根据这个提示信息,做一些分支预测上的代码优化。




相关推荐

一、概述 GCC一般包括预处理、编译、组装和链接。GCC的运行一般是调用命令gcc,在cross-compiling时使用machine-gcc或machine-gcc-version,在使用c++时

文档对应gcc版本8.4 GCC原来表示GNU C Compiler,现在一脙GNU Compiler Collection。支持C、C++、Objective-C,Objecti

一、概述 1、作用 __attribute__ 可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。

编译器中的sanitize来自于google的开源sanitizers项目,后GNU将该工具加入到GCC编译中,是查找隐藏Bug的利器。 -fsanitize=address</p

一、基本的asm 格式: asm asm-qualifiers ( AssemblerInstructions) (1)asm关键字是GNU的扩展,当编译配置项为-ansi或-std配置项时,使用__

在1999年的ISO C标准中,一个函数可以接收变参数,而宏定义中也可以接收变参数,例如: #define debug(for

强弱符号的链接规则 链接器会按照如下规则处理与选择被多次定义的全局符号 (1)不允许强符号被多次定义,如果有多个强符号定义,则链

一、概述 1、prolog与epilog prolog翻译过来是“序言;开端”。 epilog翻译过来是”后记;结语“。 prolog与epilog其实就是两段固定的代码,当编译器对程序进行编译的时候

在C语言编程过程中,我们常常会实现一些可变参数的函数调用(类scanf、printf函数),变参函数在我们编程过程中带来了很大的方便,但是也有一些问题,即我们在调用可变参数的函数的时候,默认情况

GCC:GNU(Gnu's Not Unix)编译器套装(GNU Compiler Collection,GCC),指一套编程语言编译器,以GPL及LGPL许可证所发行的自由软件