我知道向量的某些部分(实际数据)存储在堆中,而一些数据(包含长度,容量和指向堆中实际数据的指针的结构)存储在堆栈中。
矢量矢量怎么样(矢量的元素是其他矢量,例如字符串矢量)?这个外部容器向量的哪些部分存储在堆中和堆栈中?个别内在元素呢?
Vec
(包含指针,长度和容量的结构)始终存储在堆栈中并不是真的。您可以将任何类型(不包括自引用的,不可移动的)从堆栈移动到堆中,方法是将其放在Box
,Vec
或其他堆使用智能指针中。只考虑像i64
这样简单的类型:它可能存储在堆栈中(或者如果编译器选择的那样存储在寄存器中),但是如果你编写vec![7i64]
,你就会在堆上存储一个i64
,堆栈上剩下的唯一东西就是Vec
本身(一个指针加上长度和容量)。
通过这个类比,不难看出同样适用于String
:它可以在堆栈上,但你可以通过创建一个Vec<String>
将它放在堆上。因此,如果你有一个长度为100的Vec<String>
,那么有101个独立的堆分配:一个由Vec
拥有,一个由String
s拥有。