私は最近右辺値参照を研究しており、オブジェクトの完全なコピーが作成されるあらゆる場所で値渡しを使用することは非常に有利であるという結論に達しました (完全な正当化については、右辺値参照演算子を追加するときに冗長コードを削減する方法などを参照してください)。オーバーロード?とWant speed? Pass by value! ) のような場合、コンパイラはコピーを自動的に最適化して削除できるため、f(std::move(a));
はf
として定義されvoid f(A a);
ます。
std::move
どこでも値渡しのマイナスの結果の 1 つは、次のような単純なケースであっても、すべてのコードが散らかってしまうことです。
void Object::value(A a)
{
value_ = std::move(a);
}
明らかに、私が次のことだけを書いた場合:
void Object::value(A a)
{
value_ = a;
}
a
ヒントがなくても、コンパイラが寿命の終わりに近づいていることを認識し、追加のコピーで私にペナルティを科さないことは難しくありません。実際、複雑な関数であっても、コンパイラはこれを認識できるはずです。
質問:
この最適化は C++0x 標準で許可されていますか?
コンパイラはそれを採用していますか?複雑なケースでも、つまり、関数が複数の行で構成されていますか?
この最適化の信頼性はどの程度ですか?つまり、コンパイラーが戻り値の最適化を適用すると予想するのと同じくらい、コンパイラーがそれを利用することを期待できますか?