Chinaunix首页 | 论坛 | 博客
  • 博客访问: 655063
  • 博文数量: 171
  • 博客积分: 2246
  • 博客等级: 大尉
  • 技术积分: 1574
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-31 11:45
文章分类

全部博文(171)

文章存档

2018年(3)

2017年(4)

2015年(1)

2014年(20)

2013年(57)

2012年(86)

分类: LINUX

2013-09-27 16:54:24

GNU C 提供了大量的内建函数,其中很多是标准 C 库函数的内建版本,例如memcpy,printf,strchr,memset等等它们与对应的 C 库函数功能相同,,这些函数不需要包含头文件中的声明,就可以编译连接该函数的。但有时候你想自己实现,就会出现冲突的提示(解决办法:在编译时加上-fno-builtin或者-fno-builtin-FUNCTION 选项,你就可以自己实现这些函数而不冲突了)。

本文不讨论这类函数,其他内建函数
的名字通常以 __builtin 开始。

* __builtin_return_address (LEVEL)

内建函数 __builtin_return_address 返回当前函数或其调用者的返回地址,参数LEVEL 指定在栈上搜索框架的个数,0 表示当前函数的返回地址,1 表示当前函数的调用者的返回地址,依此类推。例如:

++++ kernel/sched.c
  1. 437: printk(KERN_ERR "schedule_timeout: wrong timeout "
  2. 438: "value %lx from %p\n", timeout,
  3. 439: __builtin_return_address(0));

* __builtin_constant_p(EXP)

内建函数 __builtin_constant_p 用于判断一个值是否为编译时常数,如果参数EXP 的值是常数,函数返回 1,否则返回 0。例如:
++++ include/asm-i386/bitops.h
  1. 249: #define test_bit(nr,addr) \
  2. 250:     (__builtin_constant_p(nr) ? \
  3. 251:         constant_test_bit((nr),(addr)) : \
  4. 252:             variable_test_bit((nr),(addr)))
很多计算或操作在参数为常数时有更优化的实现,在 GNU C 中用上面的方法可以根据参数是否为常数,只编译常数版本或非常数版本,这样既不失通用性,又能在参数是常数时编译出最优化的代码。

* __builtin_expect(EXP, C)

内建函数 __builtin_expect 用于为编译器提供分支预测信息,其返回值是整数表达式 EXP 的值,C 的值必须是编译时常数。例如:

++++ include/linux/compiler.h
  1. 13: #define likely(x) __builtin_expect((x),1)
  2. 14: #define unlikely(x) __builtin_expect((x),0)
++++ kernel/sched.c
  1. 564: if (unlikely(in_interrupt())) {
  2. 565:
FROM:http://blog.chinaunix.net/uid-18921523-id-191029.html
阅读(1213) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~