首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Rust中,我可以有效地按值返回对象吗?

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

Stack Overflow用户
提问于 2015-01-08 15:55:30
回答 1查看 3.9K关注 0票数 12

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

代码语言:javascript
复制
fn initialize(mydata: &mut Vec<Vec<MyStruct>>) { /* ... */ }

我更希望有:

代码语言:javascript
复制
fn initialize() -> Vec<Vec<MyStruct>> { /* ... */ }

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

EN

回答 1

Stack Overflow用户

发布于 2015-01-08 17:51:49

是的,当然可以,你应该写

代码语言:javascript
复制
fn initialize() -> Vec<Vec<MyStruct>> { ... }

(顺便说一句,Vec并没有那么大-它只有3个指针大小的整数)

Rust有RVO和这个is advertised in guides您可以使用以下代码自己查看它:

代码语言:javascript
复制
#[inline(never)]
fn initialize() -> Vec<i32> {
    Vec::new()
}

fn main() {
    let v = initialize();
}

如果你在on the playground发布模式下编译这个程序,输出汇编,你会看到:

代码语言:javascript
复制
playground::initialize:
    movq    $4, (%rdi)
    xorps   %xmm0, %xmm0
    movups  %xmm0, 8(%rdi)
    retq

Vec::new()是内联的,但是您可以看到这个想法--新的Vec实例的地址被传递到%rdi中的函数中,该函数将Vec字段直接存储到这个内存中,从而避免了在堆栈中进行不必要的复制。它是这样命名的:

代码语言:javascript
复制
playground::main:
    subq    $24, %rsp
    movq    %rsp, %rdi
    callq   playground::initialize

您可以看到,最终Vec实例将被直接放入堆栈内存。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27835375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档