1

リターンタイプは頻繁にエラーがチェックされます。ただし、実行を継続するコードは、さまざまな方法で指定できます。

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

また

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

ヘビー級CPUが単純な統計を使用して近接/局所で取得されたブランチについて推測できる1つの方法-ゼロが不明で2であるブランチ推測(-2、-1,0、+ 1、+ 2)の4ビットメカニズムを研究しました真のブランチと見なされます。

上記の簡単なテクニックを考えると、私の質問はコードを構造化する方法についてです。主要なコンパイラと主要なアーキテクチャの間には慣習がなければならないと思います。これらは私の2つの質問です

  1. コードが、パイプラインがいっぱいになっているときにブール値がバイアスされる、頻繁にアクセスされるループではない場合はどうでしょうか。
  2. 分岐に関する推測は、true、false、または0のいずれかで開始する必要があります(パイプラインは何かで満たされている必要があります)。どちらになる可能性がありますか?
4

2 に答える 2

2

動作はCPUによって異なり、コンパイラは多くの場合、命令を並べ替えます。必要なすべての情報は、次のマニュアルに記載されています:http: //agner.org/optimize/

私の意見では、何が起こるかを知る唯一の方法は、コンパイラによって生成されたアセンブリコードを読み取ることです。

于 2009-12-02T14:53:05.450 に答える
2

__builtin_expectgccでは、コンパイラに分岐予測情報を提供するために使用できます。少し簡単にするために、たとえばLinuxカーネルで使用されている可能性のある/可能性の低いマクロを借用することができます。

#defineおそらく(x)__builtin_expect((x)、1)
#definelikely(x)__builtin_expect((x)、0)

そして例えば

if (unlikely(!some_function())
    error_handling();
于 2009-12-02T21:52:28.333 に答える