【问题标题】:Why does the Rust book present assigning a variable to another as copying the top-level structure?为什么 Rust 书将一个变量分配给另一个变量作为复制顶层结构?
【发布时间】:2018-09-29 06:48:14
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: rust ownership-semantics


    【解决方案1】:

    为什么会这样显示

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

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

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

    不可能每一步都是如此,因此不值得教人们误导语义。很难确定具体细节,但我预计价值移动的可能性更高

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

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

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

    【讨论】:

    • 你有不能保持指针相等的例子吗?
    猜你喜欢
    • 1970-01-01
    • 2018-03-29
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    相关资源
    最近更新 更多