Размер кучи, стека и единиц памяти данных

В этом вопросе есть несколько частей.

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

  1. Действительно ли куча и стек всегда растут в противоположных направлениях друг к другу, особенно когда ОС выделяет дополнительную память для памяти кучи?

  2. Учтите, что изначально в программе происходит только выделение кучи и используется минимальное количество памяти стека. Следовательно, куча покрывает почти всю объединенную память, выделенную для стека и кучи. После этого стек начинает расти. Будет ли выдана ошибка или будет выделено новое место в памяти для увеличения стека до максимального предела (максимальный предел = предел, указанный командой «ulimit -s»)? Если можно выделить новое местоположение, то не нарушает ли это условие, что адреса в стеке всегда назначаются по порядку?

  3. Есть ли какой-либо предопределенный лимит на использование памяти инициализированными и неинициализированными переменными, хранящимися в разделе данных?


person nikhilsid    schedule 18.11.2013    source источник
comment
На них можно ответить только для конкретной операционной системы и архитектуры процессора. ОС и оборудование полностью определяют политику управления памятью.   -  person Gene    schedule 19.11.2013
comment
stackoverflow.com/ вопросы/2067126/   -  person stellarossa    schedule 19.11.2013


Ответы (1)


Ответы:

Do Heap and Stack actually always grow in opposite directions towards each other,
especially when extra memory is allocated by the OS for Heap memory?  

Кучи и стеки являются деталями реализации и не требуются спецификацией языка. Направления, в которых они растут, не обязательно направлены друг к другу; они могут расти как хотят.

Consider that initially in the program,  
only heap allocations take place and minimal Stack memory is used.  
Hence, Heap will cover almost entire combined memory allocated  
for Stack and heap. Afterwards, Stack starts to grow.  
Will an error be thrown or will new memory location be allotted  
for Stack to grow to its maximum limit
(maximum limit = limit shown by "ulimit -s" command)?  
If new location can be allotted, then doesn't it violate the condition  
that in Stack addresses are always assigned in order?  

Если ваша куча и стек растут навстречу друг другу, может произойти перезапись. Вы получите уведомление о переполнении только в том случае, если ваш распределитель памяти проверяет наличие нехватки места или у вас есть утилита, которая проверяет выделение стека во время выполнения. Помните, что не все платформы являются ПК с Linux или Windows; многие из них являются ограниченными встроенными системами.

Is there any pre-defined limit on the memory usage  
by initialized and uninitialized variables  
stored in Data section?  

Да, где-то должна быть память для переменных. Переменные могут быть выгружены операционной системой на внешнее устройство. Есть вероятность, что переменные являются не переменными, а аппаратными регистрами. Опять же, это все зависит от платформы. Правило, установленное стандартом языка, заключается в том, что переменные должны быть адресуемыми, а статические или автоматические переменные должны иметь уникальный адрес (правило одного определения, ODR).

person Thomas Matthews    schedule 19.11.2013