检测 Rust 移动/复制何时涉及实际复制

问题描述 投票:0回答:1

Rust

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!
  1. 如何修改这段代码,以便我们可以在运行时检测(并打印)变量 (
    y
    ) 是否实际上被复制到内存中或被优化掉(通过重用
    x
    的位置)?
  2. 有任何资源可以了解这里发生的事情的内部情况吗?
rust compiler-optimization
1个回答
3
投票

如何修改这段代码,以便我们可以在运行时检测(并打印)变量 (y) 是否实际上被复制到内存中或被优化掉(通过重用 x 的位置)?

你不能。内存副本是否被优化完全取决于编译器,只要它可以证明生成的代码是等效的即可。而且因为生成的代码是等效的,所以 99% 的情况下您不需要关心。

C++ 允许您通过复制和移动构造函数检测内存何时更改位置。然而,为了简化事情,Rust 明确要求结构可以通过简单的内存副本移动,并且不提供指定自定义移动实现的机制。

有任何资源可以了解这里发生的事情的内部情况吗?

除了查看 LLVM 如何优化代码之外,没有。

© www.soinside.com 2019 - 2024. All rights reserved.