VS 2010 を完全最適化 /Ox で使用して、次の 2 つの関数呼び出しを確認します。
static string test1(const string& input)
{
return input;
}
static void test2(const string& input, string& output)
{
output = input;
}
後者の test2 を使用すると、関数は常に最適化され、コードはインライン化されます。ただし、例外をオフにしない限り、test1 はインライン化されません。これがなぜなのか誰か知っていますか?
さらに、戻り値の最適化を使用している場合、コンパイラは test1 で test2 として効率的なジョブとして実行できると期待していますが、それを行っていないようです。これもまた、私を不可解にしています。
最初の関数シグネチャを使用する理由は、関数のコンパイル可能なバージョンが 2 つあるためです。呼び出し元のコードで常に test1 を呼び出すようにし、特定のコンパイル フラグが設定されている場合は入力をコピーに追加して返し、コンパイル フラグが設定されていない場合は no に近づけたい- 可能な限り。