0

私はc++11の移動セマンティクスで遊んでいます

コードで...

#include <vector>
#include <string>

std::vector<std::string> GetNewVector()
{
  std::vector<std::string> newVec; 
  newVec.push_back(std::string("hello")); //(1)
  newVec.push_back(std::string("whey")); //(2)

  return newVec;
}

int main(int argc, char* argv[])
{
  std::vector<std::string> vec = GetNewVector();
}

ポイント(1)で、オブジェクトがベクターに移動されるときに、「hello」オブジェクトの移動コンストラクターが呼び出されます。

ポイント(2)で、最初に「hello」の移動コンストラクターが再度呼び出され(これがベクトルが再割り当てされる場所であると想定しています)、次に「ホエー」移動コンストラクターが呼び出されます。

これはすべて予想どおりですが、ベクトルが最後に返されるときにオブジェクトが再び移動されることを期待していましたがGetNewVector()、moveコンストラクターは再度呼び出されません。私の推測では、RVOが実行されていますが、デバッグモードでVisual Studio(2k10)を実行しているため、これが発生するかどうかはわかりませんでしたか?

RVOを実行できる場合、moveコンストラクターの使用よりも優先されるというのは本当ですか?

4

1 に答える 1

6

コンテナでの移動の利点は、要素ごとに移動するように指定されている場合、大幅に機能しなくなります。

代わりに、それらは単に他の内部の内臓、sの場合は動的に割り当てられた配列へのポインターを取得しstd::vector、要素をそのままにして、これを一定の複雑な操作にします。要素ごとの移動を行った場合は、線形の複雑さの操作を検討していることになります。

RVOを実行できる場合、moveコンストラクターの使用よりも優先されるというのは本当ですか?

この点で標準は少し制限されていますが、そうです、RVO(一般にコピーの省略。名前に反する動きもカバーします)は、高速であるため、もちろん他の何よりも優先されます。:)

自動移動は、コピーの省略を実行できるコンテキストでのみ実行されますが、何らかの理由で実行されないことに注意してください。自動移動のより複雑な詳細については、この質問も参照してください。

于 2012-11-04T20:46:36.837 に答える