简单来说,std::array<T, N>
会将 T
对象储存在其内部,就像它们是普通的数据成员一样;而std::vector<T>
会在堆上分配一个缓冲区,并在该内存中构造T
对象。
对于std::array<T, N>
,由于T
对象位于std::array
内部,这些T
对象是否分配在堆或栈上取决于std::array<T, N>
所在的位置:
如果std::array<T, N>
在栈上分配,那么T
对象也将在栈上分配。
如果std::array<T, N>
在堆上分配(例如,new std::array<T, N>
),那么T
对象也将在堆上分配。
std::vector<std::array<T, N>>
向量将所有的std::array<T, N>
对象存储在其内部分配在堆上的缓冲区中。也就是说,假设vec_of_arrs
拥有自动存储期:
std::vector<std::array<T, N>> vec_of_arrs
仅有对象vec_of_arrs
是分配在栈上的。它的内部缓冲区——在其中创建std::array<T, N>
对象的连续序列——是分配在堆上的。由于T
对象直接存储在std::array
中,它们也在那个内存上被构造,即堆。
std::array<std::vector<T>,N>
std::array
将N
个std::vector<T>
对象直接作为数据成员存储在自己内部。因此,如果包含它们的std::array
分配在栈上,则std::vector<T>
对象也将在栈上。但每个向量的内部缓冲区都是在堆上分配的,因此T
对象也是在那个缓冲区上构造的。假设arr_of_vecs
具有自动存储期限:
std::array<std::vector<T>,N> arr_of_vecs;
对象arr_of_vecs
在栈上分配。 std::vector<T>
对象也在栈中分配,它们存储在std::array
对象内部(即std::array
包含一系列连续的std::vector<T>
对象)。然而,这些std::vector<T>
对象的内部缓冲区在堆上分配,T
对象是在该内存上构建的,即在堆上。