【发布时间】:2011-09-07 11:03:35
【问题描述】:
让我先说我没有分析此代码,也不是关键路径。这主要是出于我自己的好奇心。
我有一个函数将静态 int 声明/定义为已知错误值,这将导致代码采用分支。但是,如果函数成功,我可以肯定地知道该分支将永远不会再被采用。是否有编译时优化?特别是 GNU/gcc/glibc?
所以我有这个:
static unsigned long volatile *getReg(unsigned long addr){
static int fd = -1;
if (fd < 0){
if (fd = open("file", O_RDWR | O_SYNC) < 0){
return NULL;
}
}
}
因此,一旦函数成功完成(如果此函数返回 null,我将退出程序),我知道 fd 对于所有未来的调用都是有效的,并且永远不会采用第一个分支。我知道有 __builtin_expect() 宏,所以我可以写
if (__builtin_expect((fd<0),0){
但据我了解,这只是对编译器的提示,它仍然必须执行条件检查。而且我还意识到,在 99.9999% 的情况下,这已经绰绰有余,因此任何进一步的性能提升都可以忽略不计。
我想知道是否有办法在第一次运行后阻止第一次条件检查(fd
【问题讨论】:
-
缺少自修改代码,我不相信有办法在您期望行为因条件而异的情况下避免条件(或等效的函数指针)!
标签: c optimization branch control-flow