gpt4 book ai didi

struct - 在 Rust 中使用更新语法创建新结构的运行时成本

转载 作者:行者123 更新时间:2023-11-29 08:02:54 25 4
gpt4 key购买 nike

Rust 书解释了 struct update syntax可用于创建仅更新了几个字段的结构副本。

let mut point = Point3d { x: 0, y: 0, z: 0 };
point = Point3d { y: 1, .. point };

它也不必是相同的结构,可以在创建新结构时使用此语法。

let origin = Point3d { x: 0, y: 0, z: 0 };
let point = Point3d { y: 1, .. origin };

我的问题是关于第二个例子。

  1. 如果永远不会再次使用 origin 点,编译器是否仍会制作(几乎)所有字段的昂贵(如果字段很大)副本,还是只会就地更新更新的字段并等效于第一个示例?

  2. 如果就地更新:编译器如何确定它是否可以覆盖 origin 值?

最佳答案

要回答诸如“编译器是否对此进行了优化?”之类的问题,我建议查看反汇编。如果我在编译器资源管理器上编译并优化 (-O) 以下内容:

pub struct P {
x: i32,
y: i32,
}

pub fn f() -> P {
let mut point = P { x: 43, y: 12 };
point = P { y: 1, ..point };
point
}

我得到:

push rbp
mov rbp, rsp
movabs rax, 4294967339
pop rbp
ret

如果你懂一点汇编,你会发现没有创建或复制中间变量。您可以为返回值的初始化添加额外的步骤,并且输出程序集不应更改。

如果你去掉优化(我不会在这里显示汇编),你可以在汇编中看到编译器首先生成一个 Point { x: 43, y: 12 } 然后创建一个新的一种方法是复制 x 并将 y 初始化为 1。

总结:

  • 编译器生成您编写的逻辑:创建一个点,然后通过移动(即复制简单类型,例如 i32)第一个点中的一些数据来创建另一个点。
  • 优化器检测到不需要第一个点并将其优化掉。

关于struct - 在 Rust 中使用更新语法创建新结构的运行时成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48212841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com