Как вектор Vector выровнен в памяти?

Я понимаю как Установить размер вектора векторов во время выполнения  описывает, что вектор вектора можно объявить как

vector<vector<int> > ref;

затем измените размер первого уровня на

ref.resize(i);

и нажмите элемент на 2-м уровне:

ref[i].push_back(23);

Но как вектор вектора выровнен в памяти?

Для простого вектора он представляет собой контейнер и постоянно выравнивает его элемент, например, array; но в случае вектора вектора я не мог видеть изображение.

Поскольку размер каждого внутреннего вектора (вектор в векторе вектор) может измениться, внешний вектор вектора (вектор в вектор вектора) выравнивать внутренние векторы непрерывно? Проводит ли внешний вектор пространство памяти для каждого внутреннего вектора? что, если один вектор превысит?

Ответ 1

Размер структуры vector<int>, которая хранится в ref, является постоянной. Общие реализации имеют это как три указателя, или около 12 байтов на 32-разрядных архитектурах, или 24 байта на блестящих новых 64-разрядных архитектурах.

So ref управляет примерно ref.capacity() * 12 байтами непрерывного хранения.

Каждый элемент / vector<int> в ref управляет своими целыми числами, независимыми от элементов ref. В художественном рендеринге ниже ref.size() == ref.capacity() для простоты.

Pretty picture

Итак, ваш

ref.resize(i);

влияет только на верхнюю строку. Ваш

ref[i].push_back(23);

влияет только на i-й столбец.

Ответ 2

vector<vector <int>> m;
  • Внутренний вектор или строки реализуются как независимые объекты в свободном магазине.
  • Элементы в каждой строке компактно сохраняются, способные выполнять динамическое распределение через push_back и resizing.
  • Для каждого внутреннего вектора vector< vector<int> > не обязательно иметь одинаковый размер. Таким образом, внутренние векторы (а не их элементы) не хранятся смежно. Это означает, что первый элемент m[i] не сохраняется в адресе, непосредственно рядом с последним элементом m[i-1].

ли внешний вектор вектора (вектор в векторе вектора) постоянно выравнивает внутренние векторы?

Нет. См. Пункт № 2

Является ли внешний вектор исследованием пространства памяти для каждого внутреннего вектора?

Нет. См. Пункт №1. вам нужно resize или сделать push_back во внутренний вектор.

как вектор вектора выровнен в памяти?

vector<T> vec;

потребляет много памяти

sizeof(vector<T>) + (vec.size() ∗ sizeof(T))

где <

sizeof(vector<T>)= 12 байтов

и T есть vector<int> для вектора вектора.

Таким образом, память, потребляемая для 3-на-4 vector<vector<int>>, будет.

 = sizeof(vector<vector<int>>) + (vec.size() * sizeof(vector<int>))
 = 12 + 3 * 12 
 = 48 

что, если один вектор превысит?

Функция vector.resize, искажающая память, когда размер слишком велик

Ответ 3

A vector<vector<int>> может выглядеть так в памяти:

+-+-+-+
|b|e|c|  vector<vector<int>
+-+-+-+ 
 | | |
 | | +-------------------+
 | |                     |
 | +---------------+     |
 |                 |     |
 V                 V     V
+-+-+-+-+-+-+-+-+-+
|b|e|c|b|e|c|b|e|c|  3x vector<int>
+-+-+-+-+-+-+-+-+-+ 
 | | | | | | | | |
 | | | | | | | | +-------------+
 | | | | | | | |               |
 | | | | | | | +-------+       |
 | | | | | | |         |       |
 | | | | | | V         V       V
 | | | | | |+-+-+-+-+-+      
 | | | | | ||i|i|i|i|i|   5x int   
 | | | | | |+-+-+-+-+-+      
 | | | | | |       
 | | | | +-+---+ 
 | | | |       | 
 | | | V       V 
 | | |+-+-+-+-+  
 | | ||i|i|i|i|  4x int
 | | |+-+-+-+-+
 | | |
 | +-+-----------+
 |               |
 V               V
+-+-+-+-+-+-+-+-+
|i|i|i|i|i|i|i|i|  8x int
+-+-+-+-+-+-+-+-+

Здесь b обозначает begin() poiner, e обозначает указатель end(), а c обозначает указатель capacity().

Вы видите, что строки не смежны в памяти, как вы ожидаете от структуры матрицы. Каждый вектор (внутренний и внешний векторы) заботится о своих собственных распределениях памяти. Внешнему вектору не важно, что он делает.