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



Rust 编程语言中关于所有权的部分中,Strings 表示为具有 3 个字段的结构(3 个字段中有一个是指向实际字节向量的指针)。有一个例子:

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

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

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

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

为什么会这样呈现

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

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

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

不可能每个动作都是如此,所以不值得教人们误导性语义。很难确定具体细节,但我希望有更高的机会移动价值:

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

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

实现不一定会制作副本。虽然语义不能保证地址保持不变,但它们也不会强制要求地址必须更改。事实上,优化程序会花时间尝试尽可能减少各种不必要的副本。所讨论的特定示例极不涉及任何副本。

相关内容

  • 没有找到相关文章

最新更新