我已经阅读了下面的帖子,它很好地了解了移动语义:
但是我仍然无法理解有关移动语义的以下内容-
复制省略和 RVO 是否仍然适用于没有移动构造函数的类?
即使我们的类没有移动构造函数,但 STL 容器有一个。对于像这样的操作
std::vector<MyClass> vt = CreateMyClassVector();
并执行排序等操作。为什么 STL 不能在内部利用移动语义来使用不需要移动构造函数的复制省略或 RVO 等操作在内部改进此类操作?
3. 在以下情况下,我们是否受益于移动语义 -
std::vector< int > vt1(1000000, 5); // Create and initialize 1 million entries with value 5
std::vector< int > vt2(std::move(vt1)); // move vt1 to vt2
由于整数是原始类型,移动整数元素不会提供任何优势。或者在移动操作之后 vt2 只是指向堆中的 vt1 内存,并且 vt1 设置为 null。实际发生了什么?如果是后者,那么即使第 2 点也认为我们的类可能不需要移动构造函数。
4. 当使用 std::move 左值调用 push_back() 时,例如:
std::vector<MyClass> vt;
for(int i=0; i<10; ++i)
{
vt.push_back(MyClass());
}
MyClass obj;
vt.push_back(std::move(obj));
现在,由于向量具有连续的内存分配,并且 obj 在内存中的其他位置定义,移动语义如何将 obj 内存移动到向量 vt 连续内存区域,在这种情况下不移动内存与复制内存一样好,移动如何证明通过简单地移动指向堆的不同区域中的内存的指针来向量连续的内存需求。?
感谢您提前解释!
[最初发布为移动语义澄清,但现在随着上下文的变化,将其发布为新问题应尽快删除旧问题。]