gpt4 book ai didi

optimization - 我可以在 Rust 中按值有效地返回对象吗?

转载 作者:行者123 更新时间:2023-11-29 07:46:03 24 4
gpt4 key购买 nike

我想用函数初始化一个大对象。目前我有:

fn initialize(mydata: &mut Vec<Vec<MyStruct>>) { /* ... */ }

我更愿意拥有:

fn initialize() -> Vec<Vec<MyStruct>> { /* ... */ }

我听说 C++ 经常实现返回值优化 (RVO),如果你幸运并且有一个好的编译器。我们可以在这里禁用复制并通过传递给函数的隐藏指针返回它吗? RVO 是语言的一部分还是可选的优化?

最佳答案

是的,无论如何,你应该写

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();
}

如果你在 Release模式下编译这个程序 on the playground ,输出程序集,除此之外你会看到这个:

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实例会被直接放入栈内存。

关于optimization - 我可以在 Rust 中按值有效地返回对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27835375/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com