C ++ 11移动sematincs,我理解这个吗?

时间:2017-07-04 20:27:15

标签: c++ c++11 vector move

我第一次接近C ++,我正在阅读C ++编程语言作为指南。

我原则上理解移动语义,我想知道我是否理解它们何时被使用,但我真的不知道如何自己测试它。

如果我有这个:

vector<int> a{1,2,3,4,5};
vector<int> b = a;

这是一个(慢)副本。 a ha名称,它是左值(可以修改),因此编译器通过分配新的向量并逐个复制每个元素将其内容复制到b中。

在这种情况下:

vector<int> a{1,2,3,4,5};
vector<int> b = std::move(a);

我强迫“成为”一个右值(无法修改),并且它的内容在没有开销的情况下被移动到b。 (顺便说一下,std ::是否需要执行昂贵的操作?)

如果我有一个返回向量的函数(foo())并且我这样做

b = foo();

当foo()返回向量时,我正在移动,因为返回的值是rvalue。当我声明将返回的向量时,内存仅在foo()中分配一次。

当我使用这样的构造函数时:

vector<Object> x{new Object(),new Object(),new Object()};

我仍在采取行动,因为这三项新行动的结果是右值,对吧?

x = new Object();

这也会导致移动,假设x类型是什么,它有移动分配。

对于支持push_back()(或其他类似操作)的容器,如果我传递给push_back()一个rvalue,则会有一个移动,否则就是一个副本。像:

vector<int> a{1,2,3,4,5};
b.push_back(a);
b.push_back(std::move(a));

在第二种情况下,a将通过移动而不是副本附加到b。在第一种情况下,它将是一份副本。

另一件事:

vector<int> a{1,2,3,4,5};
vector<int> b = std::move(a);

在这种情况下,a是“静态”内存,不是动态分配的。它的内容被移到了b。是否会占用我需要以某种方式释放的更多记忆?

非常感谢你的帮助!

0 个答案:

没有答案