我对 Rust 的学习让我了解了动态大小类型 (DST),并且我知道这些类型的大小在编译时无法得知。例如str
。
我现在的问题是,我说 DST 永远不会存在于堆栈上,它们只存在于堆上,这样说对吗?
另外,另一方面,说大小类型可以存在于堆栈中是否正确:
(eg. let x:u32 = 10)
但也可以存在于堆上,例如通过使用 Box
(eg let x: Box<u32> = Box::new(10))
上述这些说法是否正确?
未调整大小的类型通常最好解释为“只是数据”。无论数据位于何处对于 DST 的定义并不重要。
例如,您可以让 dst 位于堆栈中:
let x = [1, 2, 3];
let y = &x[..];
Run Code Online (Sandbox Code Playgroud)
该数组x
存在于堆栈中,当您将其放在 while in 的引用下时,其数据被理解为 dst y
。
y
具有类型&[i32]
——即对某些i32
s 的引用。在这种情况下,引用指向堆栈上的数据。
您可以放置 DST 的其他值得注意的地方是:
Box
通过分配( 、Rc
、Arc
、Vec
等)的堆"abc"
)。extern type
夜间代码中的 s)。本质上,任何类型都可以存在于堆栈和堆上(除非与生命周期相关的问题)。如果堆栈上有大小类型,请将其装箱并将其放在堆上。如果您想要堆栈上的切片,请切片为数组或字符串。如果您想要一个特征对象,请引用堆栈上的值等。