10

ifステートメントは分岐予測により依存しており、v-table ルックアップは分岐ターゲット予測により依存しているということを正しく理解していますか? vテーブルに関しては、「分岐予測」はなく、ターゲット予測だけですか?

v-table が CPU によってどのように処理されるかを理解しようとしています。

4

1 に答える 1

9

分岐予測とは、分岐が成立するかどうかを予測することです。分岐先予測は分岐先の予測です。これら 2 つのことは独立しており、すべての組み合わせで発生する可能性があります。

これらの例は次のとおりです。

無条件分岐、固定対象

  • 無限ループ
  • goto声明
  • breakまたはcontinueステートメント
  • ステートメントの「then」節の終わりif/else(節を飛び越えるためelse)
  • 非仮想関数呼び出し

無条件分岐、可変ターゲット

  • 関数から戻る
  • 仮想関数呼び出し
  • 関数ポインタ呼び出し
  • switchステートメント (ジャンプ テーブルにコンパイルされている場合)

条件分岐、固定対象

  • if声明
  • switchステートメント (一連のif/elseステートメントにコンパイルされている場合)
  • ループ条件テスト
  • &&and||演算子_
  • 三項?:演算子

条件分岐、可変ターゲット

  • 通常の状況では発生する可能性は低くなりますが、コンパイラは上記の 2 つのケースを組み合わせて、最適化として 1 つを合成する場合があります。たとえば、x86 では、テール コールの最適化により、コンパイラがコードif (condition) { obj->VirtualFunctionCall(); }を条件付き間接ジャンプのようにjne *%eax最適化して、関数の最後に表示される場合があります。
于 2014-02-06T17:00:24.660 に答える