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