Переполнение стека - статическая память против динамической памяти - PullRequest
4 голосов
/ 14 октября 2010

Если вы напишите int m[1000000]; внутри основной функции C / C ++, он получит ошибку времени выполнения при переполнении стека.Вместо этого, если вы напишите vector<int> m;, а затем добавите туда элементы push_back 1000000, все будет работать нормально.

Мне очень любопытно, почему это происходит.Они оба являются локальной памятью, не так ли?Заранее спасибо.

Ответы [ 4 ]

12 голосов
/ 14 октября 2010

Да, сам вектор является автоматическим (стековым) объектом.Но вектор содержит указатель на его содержимое (внутренний динамический массив), который будет размещен в куче (по умолчанию).Чтобы немного упростить, вы можете думать о vector как о внутренних вызовах malloc / realloc или new[] (на самом деле он использует allocator ).

EDIT: AsЯ заметил, что автоматические переменные размещаются в стеке, а malloc обычно размещается в куче.Доступная память для каждой из них зависит от платформы и даже от конфигурации, но доступная память стека обычно намного более ограничена.

6 голосов
/ 14 октября 2010

Объем стековой памяти ограничен, поскольку ее необходимо резервировать заранее.Однако объем динамической памяти обычно расходуется до гораздо более высоких пределов, налагаемых вашей ОС, но «почти» достигает пределов виртуального адресного пространства (2 ГБ для 32-разрядной машины, намного больше для 64-разрядной).machine).

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

5 голосов
/ 14 октября 2010

int m [1000000] - выделит 1000000 дюймов в стеке .поскольку стек ограничен, он выдаст ошибку времени переполнения стека.

vector m;и затем push_back из 1000000 элементов работает, потому что внутренне вектор выделяет память в куче, а не в стеке .поэтому в вашем стеке приложений присутствует только векторный объект, поэтому он не выбрасывает ошибку времени переполнения стека.

1 голос
/ 14 октября 2010

Сам векторный объект находится в стеке; но внутри он будет выделять память из кучи по мере необходимости для хранения произвольного числа элементов. Таким образом, стоимость стека мала и фиксирована для него.

...