Как вектор 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()
.
Вы видите, что строки не смежны в памяти, как вы ожидаете от структуры матрицы. Каждый вектор (внутренний и внешний векторы) заботится о своих собственных распределениях памяти. Внешнему вектору не важно, что он делает.