2017-06-07 13 views
3

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の便宜のために使用しても問題ないですか、それともポインタを使用する必要がありますか?両方のバージョンがある意味で「良いスタイル」であると想像することができ、情報に基づいた意見を非常に感謝しています。

+0

一般的に私は、コンパイラがそのような最適化を行うことを保証できるかどうかは疑いがあります。しかし、「素敵で、簡単でシンプル」な方法でコードを書いてください。次に、あなたのパフォーマンス要件を満たしているかどうかをチェックします。それがあった場合は、ただそれについて喜んでください。そうでない場合は、パフォーマンス・キラーがどこにあるかを見つけるためにプロファイリングを行います。 – 4386427

+0

コンパイラがこの結論に来て、代わりに参照を渡すならば、foo()が長時間実行されている関数で、他のスレッドがhuge_tインスタンスにアクセスし、場合によってはそれを変更するとどうなるでしょうか? – mvidelgauz

+0

@mvidelgauzは、「volatile」と宣言されているはずです。 Joking ofc。私はコンパイラがこの最適化を行うことを許可されているとは思わないが、他の人は私よりもよく分かっているかもしれない。 –

答えて

5

あなたがここを見ている場合:Why isn't pass struct by reference a common optimization?

その任意のCコンパイラは、この最適化を行いますことは非常に低いです。それは一般的に安全なことではありません。

あなたのオプティマイザは、あなたが望むように物事を行うとは決して仮定しないでください。オプティマイザは、特定のルールに準拠しているため、コードが破られることはありません。オプティマイザが傾けるときに何かが安全であることを時々知っている。パフォーマンスのために、あなたのコードが特定のやり方で動作する必要がある場合は、そのように記述します。

+1

一般的には:あなたが使用している特定のコンパイラがあなたが探している最適化を行っている場合でも、すべてのコンパイラが行うとは思わないでください。 @Philipは、「あなたのコードが特定のやり方で動作するようにするには、そのように書いてください」と述べています。 –

+0

ありがとう、素晴らしい参照、私はそのポストを見なかった何らかの理由で。また、誰もが落ち着いているように、具体的な例があるためにgccの名前をつけていました。私は正直なところ*興味がありました。私は[コンパイラを助けてくれない](https://youtu.be/AKtHxKJRwp4);-)に厳粛に誓う。 –

関連する問題