2011-06-26 6 views
10

誰かがジャンプしてProfile before optimize!と言う前に、これは単に好奇心の質問であり、this original questionに由来しています。C++コンパイラは未使用の戻り値を `reference`で最適化しますか?

同じオブジェクトを参照して戻ってきた場合、使用しないと最適化されてしまうのですか?たとえば、さまざまな数学関数を持つVector<>があります(演算子のオーバーロードを使用していないと仮定します)。それを書くの二つの方法:

inline void Vector::Add(const Vector& in) // Adds incoming vector to this vector 

OR今

inline Vector& Vector::Add(const Vector& in) // Adds incoming vector to this vector and returns a reference to this vector 

Add()は、戻り値を利用せずに使用されている場合、コンパイラは単に完全復帰を捨てて、それが何を持っているかのように機能がなりません戻り値は?そして、もしそれがinlinedでなければ?

答えて

11

参考文献は、通常、ポインタと同様の方法で実装され、コストは最小です(ほとんどの場合無視されます)。呼び出し規約に応じて、レジスタ内の単一のストアにすることができます。

コンパイラがコードnoをインライン展開しない限り、リターンを最適化できるかどうかについては、できません。コンパイラが関数を処理するとき、呼び出しコードがreturn文を使用するかどうかは分かりません。つまり、必ずreturnとする必要があります。

+0

+1もう一つの良い答えはいつものように:) –

+2

これは、コンパイラが呼び出されるたびに関数を処理するのではなく、一度処理することを前提としています。多くの現代のコンパイラは、後者を実行します(または実行するように設定できます)。彼らがそうする理由の1つは、この種の最適化を正確に許可することです。 –

+0

"コンパイラがコードnoをインライン化していない限り" - 現在、LTOですべての非共有オブジェクトコードをインライン化できるので、おそらくyes :-) –

4

関数がインライン化されていない場合は、戻り値をどこかに格納する必要があります。おそらくCPUレジスタです。これはおそらく単一のレジスタコピーを必要とするだけです。ほとんどの場合、オーバヘッドが単一のCPUサイクル以上であれば驚くでしょう。

関連する問題