Copy
特质做出了这样的评论:
在幕后,复制和移动都可能导致在内存中复制位,尽管这有时会被优化。
文档提供了这段代码供参考:
// We can derive a `Copy` implementation. `Clone` is also required, as it's
// a supertrait of `Copy`.
#[derive(Debug, Copy, Clone)]
struct Foo;
let x = Foo;
let y = x;
// `y` is a copy of `x`
println!("{x:?}"); // A-OK!
y
) 是否实际上被复制到内存中或被优化掉(通过重用 x
的位置)?如何修改这段代码,以便我们可以在运行时检测(并打印)变量 (y) 是否实际上被复制到内存中或被优化掉(通过重用 x 的位置)?
你不能。内存副本是否被优化完全取决于编译器,只要它可以证明生成的代码是等效的即可。而且因为生成的代码是等效的,所以 99% 的情况下您不需要关心。
C++ 允许您通过复制和移动构造函数检测内存何时更改位置。然而,为了简化事情,Rust 明确要求结构可以通过简单的内存副本移动,并且不提供指定自定义移动实现的机制。
有任何资源可以了解这里发生的事情的内部情况吗?
除了查看 LLVM 如何优化代码之外,没有。