如果我们有一个已经在堆栈上分配的值,那么装箱会将它复制到堆中然后转移所有权(这就是它在.NET中的工作方式,除了两个副本都能保持活动状态)?或者编译器是否"足够"以便从一开始就直接在堆上分配它?
struct Foo {
x: i32,
}
fn main() {
// a is allocated on stack?
let a = Foo { x: 1 };
// if a is not used, it will be optimized out
println!("{}", a.x);
// what happens here? will the stack allocated structure
// be moved to heap? or was it originally allocated on heap?
let b = Box::new(a);
}
Run Code Online (Sandbox Code Playgroud)
我不是汇编程序的专家,但看起来它实际上是在堆栈上分配然后移动:http://pastebin.com/8PzsgTJ1.但我需要一个确实知道发生了什么的人的确认.
我正在阅读有关NRVO的文章并试图了解何时应该依赖它而不是何时依赖它.现在我有一个问题:为什么要依靠NRVO呢?始终可以通过引用显式传递返回参数,那么有没有理由依赖NRVO?