显然,在99%的情况下,它是否有效并不重要,只是为了帮助像我这样愚蠢而焦虑的开发人员晚上睡个好觉:

假设您的代码调用了一个复杂的库函数,该函数返回一个可变引用,然后您希望返回该引用.此引用也恰好是对实现Clone的类型的引用.因此,为了避免过多的重构,您可以这样做:

fn common_behavior(specs: Specs) -> ClonableThing {

    let mut intermediate_thing = IntermediateThing::new(specs);

    let clonable_thing: &mut ClonableThing = intermediate_thing.create_mut_ref_to_thing();

    // Will the clone here be reliably optimized out?
    std::mem::replace(clonable_thing, clonable_thing.clone())
}

显然,当intermediate_thing和其他所有内容超出范围时,clonable_thing.clone()生成的替换值将立即被删除,但我们能指望克隆操作本身不会发生吗?这是假设intermediate_thing是一个相当复杂的 struct 体,但克隆本身只是由#[derive(Clone)]生成的.

推荐答案

编译器不能保证这一点.特别是,您对clone()的调用可能会产生副作用,在这种情况下,编译器不允许将其优化.

在实践中,如果你的clone()的实现很简单(几乎总是这样),它通常会被优化掉,但唯一能clone()%确定的方法是反汇编代码.

Rust相关问答推荐

如何最好地并行化修改同一Rust向量的多个切片的代码?

Arrow RecordBatch as Polars DataFrame

何时可以在Rust中退出异步操作?

Rust TcpStream不能在读取后写入,但可以在不读取的情况下写入.为什么?

如何删除Mac Tauri上的停靠图标?

根据填充系数以相对大小在给定空间中布局项目

关于使用平面图功能的borrow 判断器的问题

为什么AsyncRead在Box上的实现有一个Unpin特征绑定?

为什么比较Option<;字符串>;具有常数Option<&;str>;需要显式类型转换吗?

为什么 `Deref` 没有在 `Cell` 上实现?

我可以解构self 参数吗?

面临意外的未对齐指针取消引用:地址必须是 0x8 的倍数,但为 0x__错误

在给定 Rust 谓词的情况下,将 Some 转换为 None 的惯用方法是什么?

没有得到无法返回引用局部变量`queues`的值返回引用当前函数拥有的数据的值的重复逻辑

如何使返回 XMLError 的方法与 anyhow::Error 兼容?

有没有办法在 Rust 中对 BigInt 进行正确的位移?

如何在 Rust 的泛型函​​数中同时使用非拥有迭代器和消费迭代器?

为什么我不能将元素写入 Rust 数组中移动的位置,但我可以在元组中完成

如何从 Rust 应用程序连接到 Docker 容器中的 SurrealDB?

这个 match 语句的默认值应该是什么,还有一种方法可以解开 Some case (chess in rust)