今日まで、構造体が十分に大きくて後者の方が高速である場合、適切なコンパイラは構造体の値渡しを参照渡しに自動的に変換するといつも思っていました。私の知る限り、これは非常に簡単な最適化のようです。しかし、これが実際に起こるかどうかという好奇心を満たすために、C++ とDの両方で簡単なテスト ケースを作成し、GCC と Digital Mars D の両方の出力を調べました。問題の関数は、渡された構造体を変更せずに、メンバーを追加して値を返しました。C++ バージョンは以下のとおりです。
#include "iostream.h"
struct S {
int i, j, k, l, m, n, o, p;
};
int foo(S s) {
return s.i + s.j + s.k + s.l + s.m + s.n + s.o + s.p;
}
int main() {
S s;
int bar = foo(s);
cout << bar;
}
int
私の質問は、これらすべてのs を実際にスタックにプッシュするのではなく、コンパイラがこのようなものを参照渡しに最適化しないのはなぜですか?
注: 使用されるコンパイラ スイッチ: GCC -O2 (-O3 inlined foo().)、DMD -O -inline -release。
編集:明らかに、一般的なケースでは、値渡しと参照渡しのセマンティクスは同じではありません。たとえば、コピー コンストラクターが含まれている場合や、呼び出し先で元の構造体が変更されている場合などです。ただし、多くの現実世界のシナリオでは、セマンティクスは観察可能な動作に関して同一です。これらは私が尋ねているケースです。