我是 Rust 新手,试图了解拳击是如何工作的。 默认情况下,对象分配在堆栈中。 在下面的代码中,对象“s”被分配在堆栈中。这意味着变量 x 和 y 被分配在堆栈中。
struct MyStruct {
x: u64,
y: u64,
}
let s = MyStruct { //allocation in the stack ? both x and y allocated in stack?
x : 120, y: 100,
};
现在,如果我将变量 's' 装箱,它会被移动到堆中吗?
let boxed_s = Box::new(s); //move to heap ? copy x and y bytes to heap?
这意味着存在从堆栈到堆的字节到字节复制,因为它需要分配和移动 x 和 y 的值?
如果是这样,这不是造成开销吗?
或者编译器是否做了一些编译时优化以确保对象在运行时直接分配在堆中?
这要看情况。
一般来说,如果您创建实例并立即将其包装在
Box
中,编译器应该以直接在堆上创建实例的方式对其进行优化,而不在堆栈上进行不必要的分配。
如果您首先创建一个实例并在将其移动到Box
之前使用它,则不会发生上述优化。