相关疑难解决方法(0)

Rust可以在某天移动对象期间优化掉逐位复制吗?

考虑一下片段

struct Foo {
    dummy: [u8; 65536],
}

fn bar(foo: Foo) {
    println!("{:p}", &foo)
}

fn main() {
    let o = Foo { dummy: [42u8; 65536] };
    println!("{:p}", &o);
    bar(o);
}
Run Code Online (Sandbox Code Playgroud)

该计划的典型结果

0x7fffc1239890
0x7fffc1229890
Run Code Online (Sandbox Code Playgroud)

地址不同的地方.

显然,大型数组dummy已被复制,正如编译器的移动实现中所期望的那样.不幸的是,这可能会产生非平凡的性能影响,因为这dummy是一个非常大的阵列.这种影响可以迫使人们选择通过引用来传递参数,即使函数实际上在概念上"消耗"了参数.

由于Foo没有派生Copy,对象o被移动.由于Rust禁止访问被移动的对象,是什么阻止bar了"重用"原始对象o,迫使编译器生成一个可能昂贵的按位复制?是否存在根本性的困难,或者我们是否会看到编译器有一天会优化掉这个逐位复制?

move-semantics rust llvm-codegen

17
推荐指数
1
解决办法
2612
查看次数

标签 统计

llvm-codegen ×1

move-semantics ×1

rust ×1