c++ - 详细 move 语义

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

在下面的代码中,与 pm 对齐,该行是否会 move 整个内存并将其分配给 pm,或者它只会 move 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;
    }

最佳答案

它将指针 p 复制到指针 pm 中。

“move ”指针没有意义,因为:

  • 他们没有 move 构造函数
  • 他们没有 move 赋值运算符
  • 它们非常简单, move 它们没有任何好处

您对整个数组将以某种方式“move ”的期望也是没有意义的,因为:

  • 您已经只获得了相同数据的句柄,因此无处可移
  • int* 类型不知道其实例可能指向的数据

请记住,名字很糟糕的 std::move 实际上并没有 move 任何东西。它只是为您提供一个名称中的右值,否则该名称可能会被视为左值

在这种情况下,区别是无关紧要的,所以就好像您根本没有写move

move 语义对于间接管理内存的更大、更复杂的对象很有用,例如使用指针。您会期望此类类型的 move 构造函数或 move 赋值运算符交换指针。就抽象而言,这就是;这就是它的用处。

尝试将相同的逻辑应用于指针本身是没有任何意义的,除非是 unique_ptr 的情况,在这种情况下可以找到最纯粹的抽象形式,因为这样的对象是裸指针上的极薄包装。它仍然只是 move 的包装器。

最好的办法是将 p 复制到 pm 中,然后通过将其设置为某些不可用的方式任意使 p“无效”值(value)。同样,非常无用。

关于c++ - 详细 move 语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33188885/

相关文章:

c++ - 如何实现 "const"和 "non-const"重载而不重复代码?

C++ 一个 "string made out of digits"的衬里

c++ - move 赋值运算符异常

c++ - 类设计复杂化(C++)

C++11 范围内的随机数和明确的可能性

c++ - c++ move语义不执行move

c++ - 统一 const T& 和 T&& 重载

c++ - 使用 : 限制结构大小

c++ - 在运行时使用模板化的 constexpr

C++ .lib 文件到 mex