Rust Copy trait人说了这样的话:

在幕后,复制和移动都可能导致内存中的位被复制,尽管这是sometimes optimized away位.

文档提供了以下代码以供参考:

// 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. 有没有任何资源来了解这里正在发生的事情的内在原因?

推荐答案

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

你不能.内存的副本是否被优化完全取决于编译器,只要它能证明结果代码是等价的.因为所得到的代码是等价的,所以99%的时间您不需要关心.

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

有没有任何资源来了解这里正在发生的事情的内在原因?

除了了解LLVM如何优化代码之外,没有.

Rust相关问答推荐

PyReadonlyArray2到Vec T<>

如何在原始字符串中转义";#和#";

如何处理动态 struct 实例化?

编译项目期间使用Cargo生成时出现rustc错误

支持TLS的模拟HTTP服务器

使用Box优化可选的已知长度数组的内存分配

除了调用`waker.wake()`之外,我如何才能确保future 将再次被轮询?

在我的Cargo 中,当我在建筑物中使用时,找不到我可以在产品包中使用的 crate .r我如何解决这个问题?

如何使用RefCell::JOYMOMTborrow 对 struct 不同字段的可变引用

Rust ndarray:如何从索引中 Select 数组的行

通过异常从同步代码中产生yield 是如何工作的?

Rust 中的复合 `HashSet` 操作或如何在 Rust 中获得 `HashSet` 的显式差异/并集

如何在 Rust 中打印 let-else 语句中的错误?

返回迭代器考虑静态生命周期类型

Rust:`sort_by` 多个条件,冗长的模式匹配

具有在宏扩展中指定的生命周期的枚举变体数据类型

Rust 函数指针似乎被borrow 判断器视为有状态的

是否可以预测堆栈溢出?

如何在 Rust 中编写涉及异步的重试函数

没有通用参数的通用返回