Контейнеры STL в стеке и куче - PullRequest
17 голосов
/ 29 октября 2009

Если std :: vector и друзья сами меняют размеры, значит ли это, если я объявлю вектор следующим образом:

std::vector<string> myvec;

Тогда он изменит размер, используя больше стека, тогда как:

std::vector<string> *myvec = new std::vector<string>();

Будет ли изменять размер, используя больше кучи?

Ответы [ 3 ]

24 голосов
/ 29 октября 2009

Векторы выделяются в куче во внутренних органах.

Единственное, что вы платите в стеке за бектор на основе стека, это пара байтов, внутренний буфер всегда выделяется из кучи.

Таким образом, когда вы выполняете vec = new vector (), вы выделяете небольшое количество, которое может быть не очень хорошим.

9 голосов
/ 29 октября 2009

В первом случае вы создаете вектор в стеке. Это не значит, что все внутренние объекты векторов также находятся в стеке. Фактически, вектор по-прежнему будет выделять память, необходимую для хранения объектов только в куче. Это потому, что для размещения в стеке вы должны знать, сколько объектов создать. Но эта информация недоступна, поэтому единственный оставшийся вариант - выделить память для содержащегося объекта из кучи.

1 голос
/ 29 октября 2009

std :: vector всегда имеет свой буфер, выделенный в куче. Таким образом, независимо от того, где расположен сам вектор, его изменение влияет только на кучу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...