在下面的代码中,以pm为单位,该行会移动整个内存并将其分配给pm还是只会移动内存p指向但不是整个数组?
int main()
{
int* p{ new int[10]{0} };
int* pm{ move(p) };//WILL THIS LINE MOVE THE ENTIRE MEMORY ALLOCATED FOR p THAT IS ENTIRE ARRAY or only the memory p is pointing to?
return 0;
}
答案 0 :(得分:4)
它会将指针p
复制到指针pm
中。
"移动"指针没有意义,因为:
您期望整个阵列以某种方式移动"也没有任何意义,因为:
int*
不了解其实例可能指向的数据请记住,名字非常std::move
实际上并没有移动任何东西。它只是从名称中提供 rvalue ,否则可能会将其视为左值。
在这种情况下,区别是无关紧要的,所以它就好像你根本没有写move
。
移动语义对于间接管理内存的更大,更复杂的对象很有用,例如使用指针。您可以期望移动构造函数或移动赋值运算符以使这种类型交换指针。就抽象而言;这是它有用的程度。
尝试将相同的逻辑应用于指针本身并没有任何意义,除了unique_ptr
的情况,其中这种抽象是以其最纯粹的形式找到的,因为这样的对象是一个赤裸的指针上非常薄的包装。它仍然只是被移动的包装器。
您可以做的最好的事情是将p
复制到pm
,然后随意制作p
"无效"通过将其设置为某个不可用的值。再说一遍,没用。
答案 1 :(得分:3)
查看What are move semantics?了解详情。
指针是"喜欢"整数,它们包含"地址"。以下代码
int* pm{ move(p) };
在语义上等同于
int* pm = p;
哪种效果只是复制"地址"由p
持有pm
(将其视为整数赋值)。
因此,p
所指向的记忆永远不会被移动"。
我最喜欢的关于这个主题的讨论之一是Scott Meyers' An Effective C++11/14 Sampler,其中他解释了" std::move()
如何移动而std::forward()
没有做什么&#39}。向前......他们重新演绎......" ;)