是的,无论如何,你应该写
fn initialize() -> Vec<Vec<MyStruct>> { ... }
(顺便说一下,一个Vec
没那么大——只有 3 个指针大小的整数)
Rust 有 RVO,这个在指南中刊登广告 https://web.archive.org/web/20141225073722/https://doc.rust-lang.org/guide-pointers.html#returning-pointers。您可以通过以下代码亲自查看:
#[inline(never)]
fn initialize() -> Vec<i32> {
Vec::new()
}
fn main() {
let v = initialize();
}
如果你在release模式下编译这个程序,输出程序集,除此之外你会看到这个:
playground::initialize:
movq $4, (%rdi)
xorps %xmm0, %xmm0
movups %xmm0, 8(%rdi)
retq
Vec::new()
是内联的,但你可以看到这个想法 - 新鲜的地址Vec
实例被传递到函数中%rdi
,以及函数存储Vec
字段直接写入此内存,避免通过堆栈进行不必要的复制。它的名字是这样的:
playground::main:
subq $24, %rsp
movq %rsp, %rdi
callq playground::initialize
你可以看到,最终Vec
实例将直接放入堆栈内存中。