我知道向量的某些部分(实际数据)存储在堆中,而某些数据(包含长度,容量和指向堆中实际数据的指针的结构)存储在堆栈中。
向量的向量怎么样(即向量的元素是其他向量,例如字符串的向量)?该外部容器向量的哪些部分存储在堆中和堆栈中?各个内部元素呢?
答案 0 :(得分:4)
并非总是将Vec
(包含指针,长度和容量的结构)存储在堆栈中。您可以通过将其放入Box
,Vec
或其他使用堆的智能指针中,将任何类型(不包括自引用类型,不能移动)从堆栈移动到堆。只需考虑一个简单的类型,例如i64
:它可能存储在堆栈中(如果编译器选择,则存储在寄存器中),但是如果您编写vec![7i64]
,则存储了i64
堆上剩下的唯一东西是Vec
本身(指针加上长度和容量)。
以此类推,不难发现String
同样适用:它可以放在堆栈中,但是您可以通过创建{{ 1}}。因此,如果您的Vec<String>
的长度为100,则有 101 个独立的堆分配:Vec<String>
拥有一个堆分配,Vec
每个拥有一个堆分配