4

Scott Meyers の効果的な C++ の本を読んだことがあります。

関数をインライン化すると、コンパイラが関数の本体に対してコンテキスト固有の最適化を実行できるようになります。このような最適化は、通常の関数呼び出しでは不可能です。

問題は、コンテキスト固有の最適化とは何か、なぜそれが必要なのかということです。

4

4 に答える 4

6

「コンテキスト固有の最適化」は定義された用語ではないと思いますが、基本的には、コンパイラーが呼び出しサイトとその周りのコードを分析し、この情報を使用して関数を最適化できることを意味すると思います。

これが例です。もちろん、これは不自然ですが、アイデアを示す必要があります。

関数:

int foo(int i)
{
  if (i < 0) throw std::invalid_argument("");
  return -i;
}

電話サイト:

int bar()
{
  int i = 5;
  return foo(i);
}

を個別にコンパイルする場合fooは、比較コードと例外スロー コードを含める必要があります。にインライン化されている場合bar、コンパイラは次のコードを認識します。

int bar()
{
  int i = 5;
  if (i < 0) throw std::invalid_argument("");
  return -i;
}

まともなオプティマイザーはこれを次のように評価します。

int bar()
{
  return -5;
}
于 2014-07-10T13:22:39.970 に答える
2

関数が

void fun( bool b) { if(b) do_sth1(); else do_sth2(); }

そして、事前定義されたfalseパラメーターを使用してコンテキストで呼び出されます

bool param = false;
...
fun( param);

次に、コンパイラは関数本体を次のように縮小します。

...
do_sth2();
于 2014-07-10T13:21:44.640 に答える
0

コンテキスト固有の最適化が特定の何かを意味するとは思わず、おそらく正確な定義を見つけることができないでしょう。

良い例は、プログラムがインライン化することなく、いくつかのクラス属性の古典的なゲッターです。

  1. ゲッター本体にジャンプ
  2. 値をレジストリに移動します (既定の Visual Studio 設定の Windows ではeaxon )。x86
  3. 呼び出し先に戻る
  4. eaxをローカル変数に移動

インライン化を使用すると、ほとんどすべての作業をスキップして、値をローカル変数に直接移動できます。

最適化はコンパイラに厳密に依存しますが、多くのことが考えられます (変数の割り当てがスキップされる、コードが並べ替えられるなど)。

最適化の詳細については、こちらをご覧ください。

于 2014-07-10T13:28:24.797 に答える