Scott Meyers の効果的な C++ の本を読んだことがあります。
関数をインライン化すると、コンパイラが関数の本体に対してコンテキスト固有の最適化を実行できるようになります。このような最適化は、通常の関数呼び出しでは不可能です。
問題は、コンテキスト固有の最適化とは何か、なぜそれが必要なのかということです。
Scott Meyers の効果的な C++ の本を読んだことがあります。
関数をインライン化すると、コンパイラが関数の本体に対してコンテキスト固有の最適化を実行できるようになります。このような最適化は、通常の関数呼び出しでは不可能です。
問題は、コンテキスト固有の最適化とは何か、なぜそれが必要なのかということです。
「コンテキスト固有の最適化」は定義された用語ではないと思いますが、基本的には、コンパイラーが呼び出しサイトとその周りのコードを分析し、この情報を使用して関数を最適化できることを意味すると思います。
これが例です。もちろん、これは不自然ですが、アイデアを示す必要があります。
関数:
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;
}
関数が
void fun( bool b) { if(b) do_sth1(); else do_sth2(); }
そして、事前定義されたfalse
パラメーターを使用してコンテキストで呼び出されます
bool param = false;
...
fun( param);
次に、コンパイラは関数本体を次のように縮小します。
...
do_sth2();
コンテキスト固有の最適化が特定の何かを意味するとは思わず、おそらく正確な定義を見つけることができないでしょう。
良い例は、プログラムがインライン化することなく、いくつかのクラス属性の古典的なゲッターです。
eax
on )。x86
eax
をローカル変数に移動インライン化を使用すると、ほとんどすべての作業をスキップして、値をローカル変数に直接移動できます。
最適化はコンパイラに厳密に依存しますが、多くのことが考えられます (変数の割り当てがスキップされる、コードが並べ替えられるなど)。
最適化の詳細については、こちらをご覧ください。