如果要立即删除,我们能否确定 Rust 会优化 clone() ?

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

显然,在 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?
    Ok(std::mem::replace(clonable_thing, clonable_thing.clone()))
}

显然,当

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

rust compiler-optimization
1个回答
0
投票

编译器不保证这一点。特别是,您对

clone()
的调用可能会产生副作用,在这种情况下,不允许编译器对其进行优化。

在实践中,如果您的

clone()
实现很简单(几乎总是如此),通常会对其进行优化,但 100% 确定的唯一方法是反汇编代码。

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