-2

ヘッダーは異なりますが、本体は同じで、結果を返す方法 (スタックまたはポインターを介して)とwhereCのみが異なる次の 2 つの関数を考えてみましょう。呼び出しを重ねて呼び出したり、コンパイラが両方の呼び出しを同様の結果に最適化したりすると、パフォーマンスが低下しますか。T f1(int x)void f2(int x, T *ret)sizeof(T) >= 16f1f2gcc -O2

4

1 に答える 1

0

私が見たものからパフォーマンスのペナルティがあります。f1の場合、関数はタイプTのオブジェクトを作成する必要があり、参照またはポインターから返すように指定しなかったため、そのコピーを返します(ただし、関数はメモリを割り当てる必要があります)それのための)。

ただし、f2に関しては、すでにメモリを割り当てているタイプTのオブジェクトを送信しています。これにより、関数が新しいオブジェクトを作成したり、そのオブジェクトにメモリを割り当てたりする必要がなくなるため、時間を節約できます。

gccレベル2の最適化を使用して、オブジェクトを戻り型としてコピーしないようにするためにRVOを使用するかどうかはわかりませんが。

于 2012-07-07T21:11:26.313 に答える