我有這個函數,給定Gray code,返回下一個格雷碼。你可以找到關於它如何工作的更完整的解釋here。問題是我想讓這個增量函數模塊化,這樣增加對應於UINT_MAX
的格雷碼將返回對應於0
(分別是最高有效位和0
)的格雷碼。既然這不是默認行爲,我爲這個特例添加了一個檢查。這裏是完整的算法:__builtin_expected使用邊界檢查
unsigned next_gray(unsigned gray)
{
static const unsigned msb
= 1u << (CHAR_BITS - sizeof(unsigned) - 1u);
// gray is odd
if (__builtin_parity(gray))
{
if (__builtin_expect(gray == msb, false))
{
return 0u;
}
else
{
unsigned y = gray & -gray;
return gray^(y << 1u);
}
}
// gray is even
return gray^1;
}
所以,實際的問題實際上是關於分支預測。我經常讀到__builtin_expect
只有在確實有可能選擇分支或者不太可能選擇分支時才使用,常見的例子是在沒有錯誤時加快程序運行速度。
考慮到我沒有處理錯誤的情況下,我不確定是否使用__builtin_expect
這樣的邊界檢查是一個好主意。這是一個很好的地方使用__builtin_expect
或增加最大值一個足夠常見的操作欺騙分支預測?
注:一如既往的意見和答案突出的東西並不清楚我的問題:)
我會給多一點背景:該功能意味着是一個庫的一部分,用於開發爲了成爲一個圖書館,並沒有被知道的任何實際項目所使用。因此,加入__builtin_expect
意味着我期望人們大多增加其他值然後是最大值;沒有任何實際的項目,我想知道這是否是一個安全的假設。
有一些有趣的討論在這方面的用處:[是否有編譯器提示GCC強制分支預測總是以某種方式?](http://stackoverflow.com/q/30130930/1708801) –