Rust中“同一类型所有值占用相同内存”的含义及适用范围是什么?
这个规则不是特指动态大小类型,是Rust对所有实现了Sized trait的类型的通用要求,对vector、数组也完全适用,你提到的例子只是混淆了「类型自身的栈内存大小」和「它管理的堆内存大小」。
具体解释如下:
Vec<T>本身是一个固定大小的结构体,在64位平台上永远占24字节,内部包含三个字段:指向堆内存的指针、元素长度、容量。不管堆上存了3个还是6个i32元素,v1和v2作为Vec<i32>类型的实例,自身占用的栈内存大小完全一致,符合规则。你感知到的大小差异,是它们分别管理的堆内存的差异,这部分不算Vec类型本身的大小。- 数组的规则更明确:
[T; N]的长度N是类型的一部分,比如[i32;3]和[i32;6]本身就是两个不同的类型,每个类型的所有实例大小固定,同样符合规则。
动态大小类型(比如str)之所以特殊,是因为它本身没有固定的栈上大小:不同长度的str如果直接存在栈上,需要的空间不一样,所以Rust不允许直接声明str类型的变量,只能通过&str这类胖指针间接持有,而胖指针本身还是固定大小的(64位平台占16字节,包含数据指针和长度字段),依然符合规则。
内容的提问来源于stack exchange,提问作者liby
相关产品推荐
相关产品推荐

