6

私が持っている場合:

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

if (A)
    return true;
else if (B)
    return false;
...
else if (Z)
    return true;
else
    //this will never really happen!!!!
    raiseError();
    return false;

else if (likely(Z))コンパイラが前のチェックの分岐予測に影響を与えることなく、最後のステートメント (else) が非常にありそうにないことを示すために、最後の条件チェックの周りに like() を配置できますか?

基本的に、GCC は、分岐予測ヒントを含む単一の条件ステートメントがある場合、if-else if ブロック全体を最適化しようとしますか?

4

2 に答える 2

10

これを明示する必要があります。

if (A)
  return true;
else if (B)
  return true;
...  
else if (Y)
  return true;
else {
  if (likely(Z))
    return true;

  raiseError();
  return false;
}

これで、コンパイラは意図を明確に理解し、他の分岐確率を再割り当てしなくなります。コードの可読性も向上しました。

PS Linuxカーネルがサイレントインテグラルキャストから保護するために行う方法で、可能性と可能性が低い方法で書き直すことをお勧めします。

#define likely(x)      __builtin_expect(!!(x), 1)
#define unlikely(x)    __builtin_expect(!!(x), 0)
于 2016-08-19T01:57:41.720 に答える