как с ++ векторуправляет памятью - PullRequest
1 голос
/ 29 октября 2019

векторный контейнер хранит объект в непрерывной памяти. это легко понять для таких случаев, как вектор. но что, если это вектор векторов, например вектор>, каждый вектор в этом векторе векторов может иметь различную длину. как он управляет памятью? Распределяет ли он вектор фиксированной длины каждый раз, когда мы добавляем новый вектор? если так, что произойдет, если первый вектор вырастет из размера во время push_back. это вызовет полный вектор вектора перераспределить и скопировать / переместить?

Ответы [ 2 ]

5 голосов
/ 29 октября 2019

Вектор - это указатель на динамический массив. Если вы используете push_back и обнаруживаете, что в массиве у вас недостаточно места, вы выделяете новый, больший массив, копируете все из старого массива, а затем вставляете новое значение в.

Если у вас естьвектор векторов, то же самое справедливо для каждого из внутренних векторов.

Здесь нужно понимать, что вектор векторов (в отличие от двумерного массива), не является смежнымв памяти. Каждый из массивов внутренних векторов может быть сохранен в любом месте в памяти. Или, другими словами, « каждый вектор в векторе векторов является совершенно другим вектором. Каждый со своим собственным, совершенно отдельным и отдельно управляемым буфером. 1 »


1. Спасибо пользователю 4581301 за это!

1 голос
/ 30 октября 2019

A vector содержит указатель на непрерывный блок памяти. Когда ему не хватает памяти, он выделяет новый блок памяти. vector векторов - это просто vector указателей на блоки памяти. Хотя каждый блок памяти является смежным блоком , они не обязательно являются смежными друг с другом, то есть не обязательно, когда один вектор заканчивается, начинается следующий, почти всегда существует разрыв.

Почему не обязательно и почти всегда семантика? Потому что это зависит от используемого вами распределителя памяти и внутренних компонентов операционной системы. В конечном счете, это одна из задач ОС - выделять и обслуживать блоки памяти для программ пользовательского пространства.

...