【问题标题】:Inefficient instance construction?实例构建效率低下?
【发布时间】:2014-12-17 20:37:24
【问题描述】:

这是一个简单的struct

pub struct Point {
    x: uint,
    y: uint
}

impl Point {
    pub fn new() -> Point {
            Point{x: 0u, y: 0u}
    }
}

fn main() {
    let p = box Point::new();
}

我对构造函数工作原理的理解如下。 new() 函数在其本地堆栈中创建Point 的实例并返回它。此实例中的数据被浅拷贝到box 创建的堆内存中。然后将指向堆内存的指针分配给变量p

我的理解正确吗?两个单独的内存区域是否被初始化以创建一个实例?与我们直接从构造函数写入实例内存的 C++ 相比,这似乎是一种初始化实例的低效方式。

【问题讨论】:

    标签: rust


    【解决方案1】:

    来自relevant guide

    您可能认为这给了我们糟糕的性能:返回一个值然后立即将其装箱?!这种模式不是两全其美吗? Rust 比这更聪明。此代码中没有副本。 main 为 box 分配了足够的空间,将指向该内存的指针作为 x 传递给 foo,然后 foo 将值直接写入 Box。

    这很重要,值得重复:指针不是用于优化代码的返回值。允许调用者选择他们希望如何使用您的输出。

    虽然这里讨论的是对值进行装箱,但我认为该机制足够通用,而不是特定于框。

    【讨论】:

      【解决方案2】:

      只是为了扩展@Shepmaster 的回答:

      Rust(和 LLVM)支持 RVO 或返回值优化,如果在 box 这样的上下文中使用返回值,Rust 足够聪明,可以生成使用某种 out 指针来避免复制的代码将返回值直接写入其使用站点。 box 是 RVO 的主要用途之一,但它也可以用于其他类型和情况。

      【讨论】:

        最近更新 更多