详细移动语义

时间:2015-10-17 16:26:57

标签: c++ c++11 move-semantics

在下面的代码中,以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;
    }

2 个答案:

答案 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}。向前......他们重新演绎......" ;)