我想用一个函数来初始化一个大对象。目前我有:
fn initialize(mydata: &mut Vec<Vec<MyStruct>>) { /* ... */ }我更希望有:
fn initialize() -> Vec<Vec<MyStruct>> { /* ... */ }我听说C++经常实现返回值优化(RVO),如果你幸运并且有一个好的编译器的话。我们可以在这里禁用复制,并通过传递到函数中的隐藏指针返回它吗?RVO是语言的一部分还是可选的优化?
发布于 2015-01-08 17:51:49
是的,当然可以,你应该写
fn initialize() -> Vec<Vec<MyStruct>> { ... }(顺便说一句,Vec并没有那么大-它只有3个指针大小的整数)
Rust有RVO和这个is advertised in guides您可以使用以下代码自己查看它:
#[inline(never)]
fn initialize() -> Vec<i32> {
Vec::new()
}
fn main() {
let v = initialize();
}如果你在on the playground发布模式下编译这个程序,输出汇编,你会看到:
playground::initialize:
movq $4, (%rdi)
xorps %xmm0, %xmm0
movups %xmm0, 8(%rdi)
retqVec::new()是内联的,但是您可以看到这个想法--新的Vec实例的地址被传递到%rdi中的函数中,该函数将Vec字段直接存储到这个内存中,从而避免了在堆栈中进行不必要的复制。它是这样命名的:
playground::main:
subq $24, %rsp
movq %rsp, %rdi
callq playground::initialize您可以看到,最终Vec实例将被直接放入堆栈内存。
https://stackoverflow.com/questions/27835375
复制相似问题