【发布时间】:2013-01-14 05:58:40
【问题描述】:
我已经阅读了下面的文章,它对移动语义有了很好的了解:
但我仍然无法理解以下有关移动语义的内容 -
复制省略和 RVO 是否仍然适用于没有移动构造函数的类?
即使我们的类没有移动构造函数,但 STL 容器却有。对于像
这样的操作
std::vector vt = CreateMyClassVector();
并执行排序等操作。为什么 STL 不能在内部利用移动语义在内部使用不需要移动构造函数的复制省略或 RVO 等操作来改进此类操作?
3。 在以下情况下,我们是否会从移动语义中受益 -
std::vector
std::vector
由于整数是原始类型,移动整数元素不会提供任何优势。 或者在移动操作之后 vt2 只是指向堆中的 vt1 内存,并且 vt1 设置为空。实际发生了什么?如果是后者,那么即使第 2 点也认为我们的类可能不需要移动构造函数。
4。 当使用 std::move on lvalue 调用 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 连续内存区域,在这种情况下不移动内存与复制内存一样好,如何move 是否通过简单地移动指向堆不同区域中内存的指针来证明向量连续内存需求的合理性?
提前感谢您的解释! [按要求编辑问题。]
【问题讨论】:
-
如果您使用指针,则无需使用
move。你可以这样做.push_back(obj_ptr); obj_ptr = nullptr;在处理对象本身时使用移动语义。 -
感谢 Bartek,我意识到并编辑了这个问题,尽管 MyClass 类可能有动态内存分配。
-
另外,逗号不用于结束句子;请使用一些句号。
-
好吧,再说一遍:如果 Obj 是一个 POD,那就和你说的完全一样——它必须被复制。但是想象一下,对象的唯一内容是指向缓冲区的指针及其大小。只有这两个会被 move 复制,而要执行完整复制,您必须复制缓冲区内容。
-
但是指向缓冲区的指针不会落在不同的内存地址上,仅仅移动它可能无法满足向量所有元素的连续内存要求吗?
标签: c++ c++11 move-semantics