基本上,std::array<T, N> 将 T 对象存储在对象本身中,就像它们是普通数据成员一样,而 std::vector<T> 在堆上分配一个缓冲区并构造 @ 987654324@ 内存中的对象。
对于std::array<T, N>,由于T对象在std::array本身内部,这些T对象是分配在堆还是stack取决于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 将类型为 std::vector<T> 的 N 对象直接存储为自身内部的数据成员。因此,如果包含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 对象是在该内存即堆上构造的。