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
(右辺値参照を取るコンストラクタ) は、それ以上の作業をしなくても自動的に呼び出されます。
一般に、ライブラリの作成者以外は右辺値参照を直接使用する必要はありません。メリットの大部分が自動的に得られることになります。