Cons List是否具有堆分配数据或堆栈分配数据的属性?



来自Rust Programming Language Book第15章列表15-5,它使用Box<T>作为间接的,所以类型list的大小可以被Rust编译器知道。

根据我的理解,在下面的例子中,Cons(1, address_x)是堆栈分配的,Cons(2, address_y) &Cons(3, address_z)是堆分配的

我想知道当一个变量同时具有堆栈分配数据和堆分配数据时,它是否具有数据的两个属性?即变量list是否具有堆栈分配数据或堆分配数据的属性(如预先实现的复制特性)在这种情况下?

  • address_x指向Cons(2, address_y)
  • address_y指向Cons(3, address_z)
enum List {
Cons(i32, Box<List>),
Nil,
}
use crate::List::{Cons, Nil};
fn main() {
let list = Cons(1, Box::new(Cons(2, Box::new(Cons(3, Box::new(Nil))))));
}

只是第一个Cons(父一个)是堆栈分配的,所有其他的都是根据Boxing包装器堆分配的。

:

我想知道变量列表在这种情况下是否具有堆栈分配数据或堆分配数据的属性?

因为它拥有第一个Const,所以它也是基于堆栈的。

来自文档:

变量是堆栈框架的组成部分,或者是命名函数参数、匿名临时变量或命名局部变量

局部变量(或堆栈局部分配)直接保存一个值,在堆栈的内存中分配。该值是堆栈的一部分框架。

关于trait的问题:变量只是标识符数据是保存属性的东西。因此,无论List数据类型持有什么属性,您都可以从拥有它的变量中使用。

类型没有"堆栈分配";或"堆已分配"。它们可以以各种不同的方式分配,并且与它们的底层存储完全无关。

  • let list = List::Nil中,列表在堆栈上分配。
  • let list = Box::new(List::Nil)中,列表在堆上分配。
  • static list: List = List::Nil中,列表在程序的数据段中分配。

最新更新