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

为什么Rust book将一个变量分配给另一个变量表示为复制顶级结构?,rust,ownership-semantics,Rust,Ownership Semantics,在中,字符串s表示为具有3个字段的结构(其中一个字段是指向实际字节向量的指针)。有一个例子: let s1 = String::from("hello"); let s2 = s1; 本书将此解释为将s1中包含的三字段结构复制到s2(但不是字节向量),然后将s1中包含的结构标记为“无效”(图4-4) 为什么这样表示,而不是将s2表示为指向与s1相同的顶级结构,然后将s1标记为“无效” 这种替代的表示方式是否会导致语义上的明显差异(或者甚至会导致问题)?如果不是,是否因为它更好地反映了底层实现?

在中,
字符串
s表示为具有3个字段的结构(其中一个字段是指向实际字节向量的指针)。有一个例子:

let s1 = String::from("hello");
let s2 = s1;
本书将此解释为将
s1
中包含的三字段结构复制到
s2
(但不是字节向量),然后将
s1
中包含的结构标记为“无效”(图4-4)

为什么这样表示,而不是将
s2
表示为指向与
s1
相同的顶级结构,然后将
s1
标记为“无效”

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

为什么它是这样呈现的

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

这种交替的表示会导致语义上的明显差异吗

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

不可能每一步都是这样,所以不值得教人们错误的语义。很难确定具体细节,但我希望案例的价值转移几率更高:

  • 跨线程传输它们
  • 从函数返回值-尽管(命名)返回值优化可以防止这种情况
  • 当值“非常小”时,复制它要比取消引用内存便宜
为什么实现会进行这样的复制操作

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

为什么它是这样呈现的

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

这种交替的表示会导致语义上的明显差异吗

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

不可能每一步都是这样,所以不值得教人们错误的语义。很难确定具体细节,但我希望案例的价值转移几率更高:

  • 跨线程传输它们
  • 从函数返回值-尽管(命名)返回值优化可以防止这种情况
  • 当值“非常小”时,复制它要比取消引用内存便宜
为什么实现会进行这样的复制操作


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

您有无法保留指针相等性的示例吗?您有无法保留指针相等性的示例吗?