Если я объявлю вектор так:
int main() {
vector<string> names;
int something_else_on_the_stack = 0;
names.add("John");
names.add("Annie");
}
Как вы на самом деле можете «добавить» элементы в вектор имен? Если имена распределяются в стеке, не должно ли что-то «not_else_on_the_stack» быть сразу после него в стеке? Тогда как вы можете добавить имена к уже выделенному вектору?
Внутренне vector<string>
скорее всего будет состоять из string*
указывая на фактические данные и, вероятно, еще два size_t
члены с указанием занятой и зарезервированной памяти. Все остальное будет в куче. Следовательно, sizeof(vector<string>)
исправлено, и распределение в стеке не изменится.
std::vector
внутренне поддерживает указатель на выделенное пространство кучи, размер которого изменяется по мере необходимости. След на стеке не меняется.
Размер, который vector<string>
Занимает в стеке фиксированный, и, как правило, будет равен размеру 3 указателей (это зависит от реализации). Указатели указывают на начало хранения, емкость вектора и размер вектора. Эти указатели указывают на свободное хранилище (или кучу, если вы хотите так его называть), которое вектор выделяет по мере необходимости для хранения объектов, которые вы добавляете в вектор.