C++11 で関数呼び出しから std::vector を返す適切な方法 (移動セマンティクス) 質問する

C++11 で関数呼び出しから std::vector を返す適切な方法 (移動セマンティクス) 質問する

std::vector (または他の STL コンテナ) を埋めたい:

class Foo {
public:
  Foo(int _n, const Bar &_m);
private:
  std::vector<Foo> fooes_;
}

1.見た目は良いが、パフォーマンスは高い

std::vector<Foo> get_vector(int _n, const Bar &_m) {
  std::vector<Foo> ret;
  ... // filling ret depending from arguments
  return ret;
}

Foo::Foo(int _n, const Bar &_m) : fooes_(get_vector(_n, _m) {}

2. パフォーマンスは向上したが、見た目は劣る

void fill_vector(int _n, const Bar &_m, std::vector<Foo> &_ret) {
  ... // filling ret depending from arguments
}

Foo::Foo(int _n, const Bar &_m) { fill_vector(_n, _m, fooes_); }

get_vector冗長なコピーとコンストラクター呼び出しを回避するために、最初の例の関数を C++0x (セマンティクス機能を移動するなど) で書き直すことは可能ですか?

ベストアンサー1

C++0x互換のコンパイラと標準ライブラリを使用している場合は、最初の例の方がパフォーマンスが向上します。何もせずにの戻り値はget_vector(_n, _m)一時的なものであり、 の移動コンストラクタstd::vector(右辺値参照を取るコンストラクタ) は、それ以上の作業をしなくても自動的に呼び出されます。

一般に、ライブラリの作成者以外は右辺値参照を直接使用する必要はありません。メリットの大部分が自動的に得られることになります。

おすすめ記事