关于Rust中动态大小类型(DST)与Sized类型存储位置的疑问
Rust DST与内存存储的疑问解答
问题1:是否可认为DST永远无法存在于栈上,仅能存在于堆上?
这种说法大体正确,但需要补充细节:
- 你不能直接声明一个独立的栈变量为
str这类DST(比如let s: str = "hello";会编译报错),因为栈内存的分配要求编译时确定大小,而DST的大小只有运行时才能知道。 - DST必须通过指针类型(比如
&str、Box<str>、Rc<str>)间接引用,这些指针本身是固定大小的,可以存在栈上,但指针指向的DST数据不一定都在堆上——比如字符串字面量"hello"是存储在静态存储区,而非堆内存,但DST本身确实永远不会直接存储在栈上。
问题2:是否可认为Sized类型既可以存于栈上(如let x:u32 = 10),也可通过Box存于堆上(如let x: Box<u32> = Box::new(10))?
这个表述完全正确。Sized类型的大小在编译时确定,因此可以直接分配在栈上;同时也能通过Box、Rc等智能指针将实例分配到堆上,此时栈上仅存储指向堆内存的指针。
内容的提问来源于stack exchange,提问作者Finlay Weber
相关产品推荐
相关产品推荐

