1. ホーム
  2. c++

[解決済み] C++で、関数からベクトルを返すのはまだバッドプラクティスでしょうか?

2022-11-28 21:30:17

質問

ショートバージョンです。 多くのプログラミング言語では、ベクトルや配列のような大きなオブジェクトを返すことが一般的です。このスタイルは、クラスが移動コンストラクタを持つ場合、C++0x で受け入れられるでしょうか、それとも C++ プログラマはこれを奇妙/醜い/忌まわしいと考えるでしょうか?

長いバージョンです。 C++0xでは、これはまだ悪いフォームと見なされますか?

std::vector<std::string> BuildLargeVector();
...
std::vector<std::string> v = BuildLargeVector();

従来のものは次のようになります。

void BuildLargeVector(std::vector<std::string>& result);
...
std::vector<std::string> v;
BuildLargeVector(v);

新しいバージョンでは BuildLargeVector から返される値は rvalue であるため、v は std::vector の移動コンストラクタを使用して構築されます。

C++0x 以前でも、最初の形式は (N)RVO のために "効率的" になることがよくあります。しかし、(N)RVO はコンパイラの裁量に任されています。rvalue 参照がある今、それは 保証されます。 であり、ディープ コピーが行われないことが保証されています。

編集 : 質問は本当に最適化についてではありません。示された両方の形式は、実際のプログラムではほぼ同じ性能を持っています。一方、過去には、最初の形式は数桁悪いパフォーマンスを持っていたかもしれません。その結果、最初の形式は、長い間、C++プログラミングにおける主要なコード臭でした。もうそうではないと思いますが、いかがでしょうか?

どのように解決するのですか?

Dave Abrahams は、次のようなかなり包括的な分析を行っています。 値の受け渡しの速度 .

簡単に言うと、もし値を返す必要があるのなら、値を返しましょう。出力参照は使わないでください。コンパイラはどうせそうしますから。もちろん注意点はあるので、その記事を読むとよいでしょう。