分享
三行代码  ›  专栏  ›  技术社区  ›  user3124390

说C++对象是可移动的到底是什么意思?

  •  6
  • user3124390  · 技术社区  · 1 周前

    给出以下定义:

    • 对象——内存中保存某种类型值的连续区域。
    • 值——根据对象类型解释的对象的位。

    C++编程语言第第四版的第6.4.1节,讨论值类别时,状态:

    将其值保存到另一个位置,并将对象保留在有效的 未指定状态,而不是复制。

    问题:

    1. “把它的价值转移到另一个地方”是什么意思?
    2. 如何移动一个值(位解释)?
    3. 一个对象的字节如何在没有副本的情况下被“移动”?只是没有道理。

    有人能解释一下吗?

    2 回复  |  直到 1 周前
        1
  •  5
  •   Howard Hinnant    1 周前
    1. “把它的价值转移到另一个地方”是什么意思?

    移动后原始位置的价值并不重要。

    例如,简单地复制。如果一个人想做更多的工作(这不是仅仅用一包比特来激励的),那么可以将原始位置设置为其他一些位模式,例如全零,这仍然被认为是一个成功的移动。复制与复制的区别在于复制品应该保持原样不变。

    1. 一个对象的字节如何在没有副本的情况下被“移动”?只是没有道理。

    有时原文中的位具有 一种资源。如果只有 资源,你只需复制这些片段,现在 位置“拥有”资源,导致当两个对象都超出范围时对所述资源的重复处理。

    nullptr .


    所以副本不会复制指针。副本复制资源,然后新位置指向新资源。如果创建该资源的成本很高,那么只需复制指针并将原始指针置空,就可以降低移动成本。


    一般来说,当类型支持这两种操作时,move应该是对copy的优化。移动永远不会比复制更昂贵。如果move和copy的开销相同,那么move操作就不能实现,copy将无缝地处理移动。保持这种范式取决于每种类型的作者。

        2
  •  1
  •   Gopinath    1 周前

    ' 物体的移动 卖房子 '. 物体保持静止。只有所有权(所有权)易手。

    通过引用 '方法。这可以用一个真实的例子来解释。

    因特网路由器 是描述这个概念的最好例子之一 移动物体

    路由器将只在内存中创建数据包的一个副本,并将其引用传递给不同的子系统(路由表、NAT、安全性、QoS等)。 路由器的每个子系统都会对数据包进行操作,并将其传递给下一个子系统,直到数据包从路由器发出,到达目的地。

    在这种情况下,路由器的不同子系统在不同的时间获得对同一包对象的控制。在整个处理过程中,数据包对象保持在单个内存位置。它永远不会被复制。这种将对象所有权传递给不同子系统/功能的方法可以看作是“移动对象”。然而,在实践中,对象一直停留在原来的位置,但是对象的控制却在子系统之间移动。

    (类似于房屋出售时所有权的转移。)

        3
  •  -1
  •   Gaming Impteraix    1 周前

    一个可移动但不能复制的类的伪代码最终会像这样。。。

    x = new moveableData("longStringOfData")
    y = x;
    
    //At this point x no longer has access to or ownership of the new moveableObject or its long string of data. y does.
    

    在上面的例子中,实际发生在幕后的是一堆指针魔术和重载运算符。