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

Does Cons List have the property of a heap-allocated data or stack-allocated data?

来自 Rust Programming Language Book 第 15 章列表 15-5,它使用 Box<T> 进行间接寻址,因此 Rust 编译器可以知道类型列表的大小。

据我了解,在以下示例中,Cons(1, address_x) 是堆栈分配的,Cons(2, address_y) & Cons(3, address_z)是堆分配的。

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

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 包装器分配的堆。

然后:

I am wondering does variable list has the property of stack-allocated data or heap-allocated data in this case?

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

来自documentation

A variable is a component of a stack frame, either a named function parameter, an anonymous temporary, or a named local variable.

A local variable (or stack-local allocation) holds a value directly, allocated within the stack's memory. The value is a part of the stack frame.

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

类型不是“堆栈分配”或“堆分配”。它们可以以各种不同的方式分配,并且完全不知道它们的底层存储。

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