Есть несколько частей к этому вопросу.
Согласно большинству ресурсов, доступных в сети, а также согласно учебникам, память кучи и стека растет в противоположных направлениях.
Всегда ли Heap и Stack растут в противоположных направлениях по отношению друг к другу, особенно когда ОС выделяет дополнительную память для Heap-памяти?
Учтите, что изначально в программе происходит только выделение кучи и используется минимальная память стека. Следовательно, Heap покрывает почти всю объединенную память, выделенную для стека и кучи. После этого стек начинает расти. Будет ли выдано сообщение об ошибке или будет выделено новое место в памяти, чтобы стек мог достичь максимального предела (максимальный предел = предел, показанный командой «ulimit -s»)? Если новое местоположение может быть выделено, то не нарушает ли оно условие, что в стековых адресах всегда назначаются по порядку?
Существуют ли какие-либо заранее определенные ограничения на использование памяти инициализированными и неинициализированными переменными, хранящимися в разделе данных?
ответы:
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).
Других решений пока нет …