память — как вектор, выделенный в стеке, расширяется в c ++?

Если я объявлю вектор так:

int main() {
vector<string> names;
int something_else_on_the_stack = 0;
names.add("John");
names.add("Annie");
}

Как вы на самом деле можете «добавить» элементы в вектор имен? Если имена распределяются в стеке, не должно ли что-то «not_else_on_the_stack» быть сразу после него в стеке? Тогда как вы можете добавить имена к уже выделенному вектору?

4

Решение

Внутренне vector<string> скорее всего будет состоять из string* указывая на фактические данные и, вероятно, еще два size_t члены с указанием занятой и зарезервированной памяти. Все остальное будет в куче. Следовательно, sizeof(vector<string>) исправлено, и распределение в стеке не изменится.

8

Другие решения

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

7

Размер, который vector<string> Занимает в стеке фиксированный, и, как правило, будет равен размеру 3 указателей (это зависит от реализации). Указатели указывают на начало хранения, емкость вектора и размер вектора. Эти указатели указывают на свободное хранилище (или кучу, если вы хотите так его называть), которое вектор выделяет по мере необходимости для хранения объектов, которые вы добавляете в вектор.

2