По существу, 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
имеет автоматизирован c длительность хранения :
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::vector<T>
будут в стеке, если std::array
, содержащий их, размещен в стеке. Однако каждый куча внутреннего вектора выделяется в куче, как и объекты T
, поскольку они построены на этом буфере. То есть, предполагая, что arr_of_vecs
имеет automati c длительность хранения :
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
создаются в этой памяти, то есть в куче.