了解 Rust 堆栈分配

Gue*_*OCs 3 rust

根据https://doc.rust-lang.org/stable/rust-by-example/std/box.html

默认情况下,Rust 中的所有值都是堆栈分配的。值可以通过创建一个 Box 来装箱(分配在堆上)。一个盒子是一个指向 T 类型堆分配值的智能指针。当一个盒子超出范围时,它的析构函数被调用,内部对象被销毁,堆上的内存被释放。

所以如果我有一个std::vec::Vec<MyStruct>并且我添加了很多结构,这是否意味着这些结构是堆栈分配的?这怎么可能?如果它们在堆上,我只能拥有一组东西。堆栈上的东西是在编译时完成的,因为我明白。

Bre*_*rby 6

Box 是在堆上分配的一种方式,但不是唯一的方式。其他数据结构,包括 Vec,将它们的数据存储在堆上。所以在这种情况下,当你创建每个实例时,MyStruct它最初都会在堆栈上,但是一旦你把它推到 Vec 上,它就会被移动到堆中。至少,它在概念上是这样工作的;根据具体情况和编译器优化设置,Rust 可能能够避免物理写入堆栈,而是直接写入堆。