为什么Rust书籍在复制顶级结构时会将变量分配给另一个?

时间:2018-04-18 22:01:19

标签: rust ownership-semantics

section on ownership in The Rust Programming Language中,String表示为具有3个字段的结构(3个字段中的一个是指向实际字节向量的指针)。有一个例子:

let s1 = String::from("hello");
let s2 = s1;

本书将此解释为将s1中包含的3字段结构复制到s2(但不是字节向量),然后将s1中包含的结构标记为&# 34;无效" (图4-4)。

为什么以这种方式呈现,而不是将s2呈现为指向与s1相同的顶级结构,然后将s1标记为"无效"?

这种替代演示会导致语义上的明显差异(或者甚至会导致问题)吗?如果不是,是因为它更好地反映了底层实施吗?如果是这样,为什么实现会进行这样的复制操作?

1 个答案:

答案 0 :(得分:5)

  

为什么会这样呈现

因为这是一种非常接近(如果不是确切)的方式来建模Rust的所有权和移动语义。

  

这种替代演示会导致语义上的明显差异

是。 Rust的当前语义表明,当移动变量时,不能保证它保持在同一地址。您的替代演示文稿会向读者建议该地址保证是相同的(“因为图片告诉我了!​​”)。

对于每一个动作都不可能是这种情况,因此不值得教导人们误导语义。很难确定具体细节,但我希望有一些更高价值移动的机会:

  • 跨线程传输
  • 从函数返回值 - 尽管(命名)返回值优化可以防止这种情况。
  • 当价值“非常小”时 - 复制它比取消引用内存便宜。
  

为什么实现会进行这样的复制操作?

实施不一定要复制。虽然语义不能保证地址保持不变,但它们也不强制必须更改。事实上,优化器花费时间尝试尽可能减少各种不必要的副本。有问题的特定例子极有可能不涉及任何副本。