我第一次接近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。是否会占用我需要以某种方式释放的更多记忆?
非常感谢你的帮助!