はい、すべての手段によって、あなたは
fn initialize() -> Vec<Vec<MyStruct>> { ... }
を書くべき(ところで、Vec
はその大きさではありません - それは唯一の3ポインタサイズの整数だが、それでも)
錆がRVOがあり、この例えばhereのようにガイドに広告されています。あなたはそれを自分で見ることができます。
#[inline(never)]
fn initialize() -> Vec<i32> { Vec::new() }
fn main() {
let v = initialize();
}
あなたが他のすべての中で、「ASM」ボタンでこのプログラムon playpenを実行する場合は、この見ることができる:
_ZN10initialize20h5d5903a85c1850a8eaaE:
.cfi_startproc
movq $1, (%rdi)
movq $0, 16(%rdi)
movq $0, 8(%rdi)
movq %rdi, %rax
retq
Vec::new()
がインライン化されましたが、それにもかかわらず、あなたのアイデア見ることができる - のアドレスを新しいVec
インスタンスが%rdi
の関数に渡され、関数はVec
フィールドをこのメモリに直接格納し、スタックを介した不要なコピーを回避します。そして、これは、それが呼ばれる方法です。
leaq (%rsp), %rdi
callq _ZN10initialize20h5d5903a85c1850a8eaaE
あなたは最終的にVec
インスタンスがスタックメモリに直接置かれることがわかります。
[このディスカッション](http://discuss.rust-lang.org/t/implementation-details/948/5)は、RVOがポインタより大きなものをトリガすることを示唆しています。しかし、NRVOに関する[この未公開の問題](https://github.com/rust-lang/rust/issues/18363)もあります。ですから、私はそれが 'initialize'をどのように実装しているかによって決まると思います。 – Michael