gcc 内建函数
阅读数:407 评论数: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的可能性很大,然后编译器可能就会根据这个提示信息,做一些分支预测上的代码优化。