GCC 5.4で、-O2
または-O3
の最適化レベルで次のようにコンパイルするとします。ここで関数に大きなconst構造体を渡す
typedef struct {
int data[90];
} huge_t;
int foo(const huge_t bar);
// ...
huge_t x = { 0 };
foo(x);
、私が言ってベンチャーうfoo
ではないので、その引数を修正する(ことになって)スタック上x
の2番目のコピーを作成する必要はありません。 (いつ)GCCは同じ結論になるでしょうか?
言い換えれば、const
の引数をhuge_t
の便宜のために使用しても問題ないですか、それともポインタを使用する必要がありますか?両方のバージョンがある意味で「良いスタイル」であると想像することができ、情報に基づいた意見を非常に感謝しています。
一般的に私は、コンパイラがそのような最適化を行うことを保証できるかどうかは疑いがあります。しかし、「素敵で、簡単でシンプル」な方法でコードを書いてください。次に、あなたのパフォーマンス要件を満たしているかどうかをチェックします。それがあった場合は、ただそれについて喜んでください。そうでない場合は、パフォーマンス・キラーがどこにあるかを見つけるためにプロファイリングを行います。 – 4386427
コンパイラがこの結論に来て、代わりに参照を渡すならば、foo()が長時間実行されている関数で、他のスレッドがhuge_tインスタンスにアクセスし、場合によってはそれを変更するとどうなるでしょうか? – mvidelgauz
@mvidelgauzは、「volatile」と宣言されているはずです。 Joking ofc。私はコンパイラがこの最適化を行うことを許可されているとは思わないが、他の人は私よりもよく分かっているかもしれない。 –