これは興味深い質問です。C++03 では、2 つのオプションのいずれかを使用して最適化するより良い機会はなく、スタイルの選択の問題になります (私自身、const
ありそうもないエラーを回避するために完全に返されるとは信じていません)。
一方、C++11 では、実際に影響がある可能性があります。特に、タイプが移動操作をサポートし、戻り値からのコピー/移動を省略できない場合は、const
あなたが返すことで効果的に移動を無効にします*
// T is move assignable, with the usual declaration of a move assignment operator
T f();
const T g();
int main() {
T t;
t = f(); // can move
t = g(); // cannot move!!!
}
あなたの特定のケースでは、大きな配列があなたにとって何を意味するかによって異なります。それらがstd::array
そうである場合(または自動ストレージを備えた配列)、移動できないため、とにかくこれはオプションではありませんが、大きな配列が動的に割り当てられている場合メモリ、移動はコピーよりもはるかに効率的です。C++11 では、パフォーマンスの低下を引き起こす可能性があるのは、存在しないのではなく、存在することに注意してください。const
*これは100% trueではありません。移動代入演算子が への右辺値参照によって引数を取得した場合、移動できますconst
。しかし、標準ライブラリの型はどれもこのように引数を取らず、人々がそれを行うことも期待していません (移動const_cast
操作 (コンストラクター/代入のいずれか) 内で必要であり、意味がありません:それから移動(盗む) しているのに、なぜそれを変更しないと主張するのですか??