1

通常会检查返回类型的错误。但是,将继续执行的代码可能以不同的方式指定。保留执行流水线

if(!ret) 
{ 
    doNoErrorCode(); 
} 
exit(1); 

if(ret) 
{ 
    exit(1); 
} 
doNoErrorCode(); 

一个重量级的CPU可以推测使用简单的统计数据极为接近/地区所采用的分支的方式 - 我研究了4位机制的分支预测(-2,-1 ,0,+ 1,+ 2),其中零未知,2将被视为一个真正的分支。

考虑到上面的简单技术,我的问题是关于如何构造代码。我认为主要编译器和主要架构之间必须有一个约定。这些是我的两个问题

  1. 当代码不是一个经常访问的循环,布尔值被偏向于管道被填满时?
  2. 有关分支的猜测必须从真或假或零开始(流水线必须填充一些东西)。这可能是什么?

回答

2

不同CPU之间的行为不同,编译器通常会重新排列指令。 您可以在这些手册中找到所需的全部信息:http://agner.org/optimize/

在我看来,知道会发生什么的唯一方法是读取由编译器生成的汇编代码。

+0

谢谢,我会给它一个读。 – 2009-12-02 14:56:57

+0

惊人的内容,多<3 – 2009-12-24 19:55:08

2

在gcc上,您可以使用__builtin_expect为编译器提供分支预测信息。为了使它更容易一点,你可以借用可能/不太可能的宏,例如在Linux内核中:

 
#define likely(x)  __builtin_expect((x),1) 
#define unlikely(x)  __builtin_expect((x),0) 

然后例如,

if (unlikely(!some_function()) 
    error_handling(); 
+0

好的一条信息,谢谢。 – 2009-12-02 23:59:25