这是一个简单的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 比这更聪明。此代码中没有副本。Main 为盒子分配足够的空间,将指向该内存的指针作为 x 传递到 Foo,然后 foo 将值直接写入 Box。
这非常重要,值得重复:指针不是用来优化代码中的返回值。允许调用方选择他们想要如何使用您的输出。
虽然这谈到了装箱值,但我相信这种机制足够通用,而不是特定于盒子。
只是为了扩展一下@Shepmaster的答案:
Rust(和 LLVM(支持 RVO,或返回值优化,如果返回值用于像 box
这样的上下文,Rust 足够聪明,可以生成使用某种 out 指针的代码,通过将返回值直接写入其使用站点来避免复制。 box
是 RVO 的主要用途之一,但它也可用于其他类型和情况。