ジェームズが提供した答えに加えて、ぶら下がり参照なしで、ベクトル自体のヒープ割り当てなしで、不要なコピーなしで、最初のアイデアと同じ可読性を持つ 3 番目の可能性があります。
std::vector<int> global; //somewehere - you don't have it really global, do you?
void f() {
std::vector<int> vf;
/* ... */
g(std::move(vf));
}
void g(std::vector<int> vg) //by value!
{
/* ... */
global.swap(vg);
}
から移動vf
するとf()
、vg
の move-ctor が呼び出されます。つまり、以前に が所有していたリソースの所有権を取得するだけvf
なので、不要なコピーや割り当ては行われません。swap()
inは(したがって)への呼び出しの前に存在する場合にg()
のみ機能します。ベクターを参照に保存したいと言ったので、実際にはストレージオブジェクトを作成し、呼び出しの前にはないと思います。次に、既存のオブジェクトと交換する代わりに、ストレージ オブジェクトを介して渡す必要があります。global
g()
f()
g()
global
vg
std::move
合計すると、実際にはベクトルを 1 つだけ作成し ( vf
)、他のすべてのベクトルは実際には同じでありmove
、元のものに基づいているため、参照渡しと基本的に同じパフォーマンスが得られますが、ダングリング ref はありません。
(つまらない人向け: はい、ベクトルを移動することは ref を渡すことよりも少し多く、通常は 1 つをコピーする代わりに 3 つのポインターをコピーしてゼロにします。しかし、ヒープの割り当てやベクトルのコピーなどと比較すると、実際には何もありません。)