C ++ 11 std :: move(1)

前に書く

  • ではC ++ 11の右辺値参照(3)はstd ::動きは、その後のstd ::移動の基礎について話しています。
  • C ++ 11以降、ローカルオブジェクトを返す関数にstd :: moveを使用することはお勧めしません。これは、コンパイラの戻り値の最適化(戻り値の最適化、またはNRVOという名前)に影響を与えるためです。直接戻るだけです。

デモ

//  by 吴咏炜
#include <iostream>
#include <utility>

using namespace std;

class Obj {
public:
  Obj()
  {
    cout << "Obj()" << endl;
  }
  Obj(const Obj&)
  {
    cout << "Obj(const Obj&)" << endl;
  }
  Obj(Obj&&)
  {
    cout << "Obj(Obj&&)" << endl;
  }
};

Obj simple()
{
  Obj obj;
  // 简单返回对象;一般有 NRVO
  return obj;
}

Obj simple_with_move()
{
  Obj obj;
  // move 会禁止 NRVO
  return std::move(obj);
}

Obj complicated(int n)
{
  Obj obj1;
  Obj obj2;
  // 有分支,一般无 NRVO
  if (n % 2 == 0) {
    return obj1;
  } else {
    return obj2;
  }
}

int main()
{
  cout << "*** 1 ***" << endl;
  auto obj1 = simple();
  cout << "*** 2 ***" << endl;
  auto obj2 = simple_with_move();
  cout << "*** 3 ***" << endl;
  auto obj3 = complicated(42);
    
    cin.get();
    return 0;
}
  • 結果
*** 1 ***
Obj()
*** 2 ***
Obj()
Obj(Obj&&)
*** 3 ***
Obj()
Obj()
Obj(Obj&&)

おすすめ

転載: blog.csdn.net/luoshabugui/article/details/111659637