首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >移动语义

移动语义
EN

Stack Overflow用户
提问于 2015-10-17 16:26:57
回答 2查看 43关注 0票数 1

在下面的代码中,这一行将移动整个内存并将其分配给pm,还是只移动内存p所指向的内存,而不是整个数组?

代码语言:javascript
运行
复制
   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;
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-17 16:29:21

它将把指针p pm**.**复制到指针

“移动”指针没有任何意义,因为:

  • 他们没有移动构造函数
  • 他们没有移动赋值操作符
  • 它们很简单,移动它们也没有什么好处。

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

  • 您已经只获取相同数据的句柄,因此它无法移动到
  • 类型int*不知道其实例可能指向的数据。

记住,这个名字很糟糕的std::move实际上不会移动任何东西。它只是从名称中给出一个rvalue,否则可能会被视为lvalue。

在这种情况下,这种区别是不相关的,因此就好像根本没有编写move一样。

移动语义对于间接管理内存的更大、更复杂的对象非常有用,例如使用指针。您会期望这种类型的移动构造函数或移动赋值运算符可以交换指针。这就是抽象的范围;这就是它有用的程度。

试图将相同的逻辑应用于指针本身没有任何意义,除非在unique_ptr的情况下,这种抽象是以其最纯粹的形式出现的,因为这样的对象是一个裸指针的非常薄的包装器。仍然只有包装才会被移动。

最好的方法是将p复制到pm中,然后将p设置为不可用的值,从而任意地使p“无效”。再说一次,很没用。

票数 4
EN

Stack Overflow用户

发布于 2015-10-17 16:34:04

有关更多细节,请访问什么是移动语义?

指针是“类似”整数,它们包含“地址”。以下代码

代码语言:javascript
运行
复制
int* pm{ move(p) };

在语义上等同于

代码语言:javascript
运行
复制
int* pm = p;

其效果就是将p持有的“地址”复制到pm (将其视为整数赋值)。

因此,p指出的内存永远不会“移动”。

关于这个话题,我最喜欢的话题之一是斯科特·迈尔斯的一个有效C++11/14采样器,他在其中解释了"__std::move()不移动,std::forward()不前进.它们是类型.“。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33188885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档