Как работают массивы типа std :: vector > или std :: array хранится в памяти? - PullRequest
3 голосов
/ 05 февраля 2020

Я знаю, что std::vector<T> выделяет динамическую c память в куче. Я также знаю, что std::array<T,N> выделяет память в стеке.

Но как распределяется память, когда я объединяю оба контейнера?

Например, fe:

std::vector<std::array<T, N>> a;

или

std::array<std::vector<T>,N> a;

By :

std::vector<std::array<T, N>> a;
  • Сохраняется ли последовательность / массив возобновляемого объекта a полностью в куче или его части совместно используются кучей и стеком?

By:

std::array<std::vector<T>,N> a;
  • Является ли последовательность / массив возобновляемого объекта a полностью сохраненным в стеке или разделены ли его части между стеком и куча?

Большое спасибо за участие.

Ответы [ 2 ]

3 голосов
/ 05 февраля 2020

По существу, 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 создаются в этой памяти, то есть в куче.

2 голосов
/ 05 февраля 2020

Рассмотрим следующий код:

struct S
{
    int _i;
    /* ... */
};

int main()
{
    S s1;
    S* s2 = new S{};
    return 0;
}

Экземпляр s1 находится в стеке, как и все его члены. Содержимое, на которое указывает s2, размещено в куче, и все его члены .

Теперь ваши примеры:

// all the instances of std::array<T, N> are on the heap,
// since std::vector allocates on the heap
std::vector<std::array<T, N>>

// the array itself is on the stack, and also the vector instances,
// but the content of the vectors is on the heap, as std::vector allocates on the heap
std::array<std::vector<T>,N>
...