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

Ste*_*fan 1 ownership-semantics rust

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

let s1 = String::from("hello");
let s2 = s1;
Run Code Online (Sandbox Code Playgroud)

这本书解释此作为复制包含在3场结构s1s2(但不是字节矢量),然后标记包含在所述结构s1为"无效"(图4-4).

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

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

She*_*ter 5

为什么会这样呈现

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

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

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

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

  • 跨线程传输它们
  • 从函数返回值 - 虽然(命名)返回值优化可以防止这种情况.
  • 当值"非常小"时 - 复制它比解除引用内存更便宜.

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

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