Контейнеры STL в стеке и куча
Если std::vector и друзья меняют размер, значит ли это, если я объявляю такой вектор:
std::vector<string> myvec;
Затем он изменит размер, используя больше стека, тогда как:
std::vector<string> *myvec = new std::vector<string>();
Будет ли изменяться размер с использованием большего количества кучи?
Ответы
Ответ 1
Векторы выделяются в куче во внутренней части.
Единственное, что вы платите в стеке для bector на основе стека, - это пара байтов, внутренний буфер всегда будет выделен из кучи.
Так эффективно, когда вы делаете vec = new vector(), вы выделяете небольшое количество, которое может быть не очень хорошим.
Ответ 2
В первом случае вы создаете вектор в стеке. Это не означает, что все внутренние объекты векторов также находятся в стеке. Фактически, вектор по-прежнему будет выделять память, необходимую для хранения объектов только в куче. Это связано с тем, что для выделения в стеке вы должны знать, сколько объектов создать. Но эта информация недоступна, поэтому единственной оставшейся опцией является выделение памяти для содержащегося объекта из кучи.
Ответ 3
std::vector всегда имеет свой буфер, выделенный в кучу. Таким образом, независимо от того, где сам вектор присваивается изменением размера, он будет влиять только на кучу.