コピーを作成せずに関数から標準コンテナを返すことは可能ですか?
コード例:
std::vector<A> MyFunc();
...
std::vector<A> b = MyFunc();
私が理解している限り、これは戻り値を新しいベクトルbにコピーします。関数に参照などを返すようにすると、コピーを回避できますか?
コピーを作成せずに関数から標準コンテナを返すことは可能ですか?
コード例:
std::vector<A> MyFunc();
...
std::vector<A> b = MyFunc();
私が理解している限り、これは戻り値を新しいベクトルbにコピーします。関数に参照などを返すようにすると、コピーを回避できますか?
コンパイラがNRVOをサポートしている場合、オブジェクトを返す関数で特定の条件が満たされていれば、コピーは作成されません。ありがたいことに、これは最終的にVisual C ++ 2005(v8.0)で追加されました。 これは、明らかにコンテナーが大きい場合、パフォーマンスに大きな影響を与える可能性があります。
独自のコンパイラドキュメントにサポートされているかどうかが記載されていない場合は、C ++コードをアセンブラにコンパイルして(最適化/リリースモードで)、簡単なサンプル関数を使用して何が行われたかを確認できるはずです。
ここには、優れた幅広い議論もあります
参照にバインドされた右辺値(「一時的」)const
の有効期間は、参照の有効期間の終わりまで延長されます。したがって、そのベクトルを変更する必要がない場合は、次のようにします。
const std::vector<A>& b = MyFunc();
ベクトルを変更する必要がある場合は、この行がパフォーマンス的にも重要であるという証明(プロファイリングによって取得)が得られるまで、最も読みやすい方法でコーディングしてください。
それ以外の場合は、右辺値参照を含むC ++ 1xに依存し、セマンティクスを「すぐに現実のもの」に移行し、何もしなくてもそのコピーを最適化します。
関数のシグネチャを変更できる場合は、次を使用できます
std::vector<A>& MyFunc();
また
void MyFunc(std::vector<A>& vect);
スマートポインタを返すこともできますが、これにはオブジェクトの新規作成が含まれます。
some_smart_pointer<std::vector<A>> MyFunc();
HTH