移动语义和复制

时间:2018-03-27 21:56:13

标签: c++ c++11 move-semantics copy-elision

我知道有几次被问过,我读了几篇关于它的教程,但我还是找不到答案。

让我们有典型的课程

class Foo
{
public:
   Foo()                : i_(0) { std::cout <<  "Foo Empty ctor" << std::endl; }
   Foo(const Foo& foo)  : i_(foo.i_) { std::cout <<  "Foo Copy ctor" << std::endl; }
   Foo(int i)           : i_(i)  { std::cout <<  "Foo Param ctor" << std::endl; }
   Foo(Foo&& foo)       : i_(foo.i_) { foo.i_ = 0; std::cout <<  "Foo Move ctor" << std::endl; }
   Foo(const Foo&& foo) : i_(foo.i_) { std::cout <<  "Foo const Move ctor" << std::endl; }

   ~Foo() { std::cout << "Foo " << i_ << " destroyed\n"; }

   Foo& operator=(Foo&& other)
   {
      i_ = std::move(other.i_);
      std::cout << "Foo Move assigned\n";
      return *this;
   }
private:
   int i_;
};

Foo getFoo()
{
   return Foo(99);
}


int main()
{
   Foo f1;
   Foo f2(5);
   Foo f3(f2);
   Foo f4(Foo(4));
   Foo f5(std::move(Foo(6));
   Foo f6 = getFoo();
   Foo f7 = Foo(1);
}

输出

// f1
Foo Empty ctor

// f2 
Foo Param ctor

// f3
Foo Copy ctor

// f4 - copy elision
Foo Param ctor

// f5
Foo Param ctor
Foo Move ctor

// f6 - copy elision
Foo Param ctor

// f7 - copy elision
Foo Param ctor

因此,除非我明确调用move运算符,否则即使不声明移动语义,复制省略优化也会做同样的工作。

1 - 如果我们没有处理指针并且我不打算调用一个显式的std :: move(所以我认为像示例中的隐式调用一样)是否有意义声明移动语义如果副本elision做的不一样吗?

2 - 对于具有简单数据的小类,通常会感觉到声明移动语义吗?它有真正的优势吗?

0 个答案:

没有答案