Во-первых, это зависит от платформы.В некоторых архитектурах стек выделяется из нижней части адресного пространства и растет вверх.
Принимая во внимание архитектуру, подобную x86, стек, выросший сверху вниз из адресного пространства, идея довольно проста:
=============== Highest Address (e.g. 0xFFFF)
| |
| STACK |
| |
|-------------| <- Stack Pointer (e.g. 0xEEEE)
| |
. ... .
| |
|-------------| <- Heap Pointer (e.g. 0x2222)
| |
| HEAP |
| |
=============== Lowest Address (e.g. 0x0000)
Чтобы увеличить стек, вы должны уменьшить указатель стека:
=============== Highest Address (e.g. 0xFFFF)
| |
| STACK |
| |
|.............| <- Old Stack Pointer (e.g. 0xEEEE)
| |
| Newly |
| allocated |
|-------------| <- New Stack Pointer (e.g. 0xAAAA)
. ... .
| |
|-------------| <- Heap Pointer (e.g. 0x2222)
| |
| HEAP |
| |
=============== Lowest Address (e.g. 0x0000)
Как видите, чтобы увеличить стек, мы уменьшили указатель стека с 0xEEEE до0xAAAA, тогда как для увеличения кучи необходимо увеличить указатель кучи.
Очевидно, это упрощение структуры памяти.Фактический исполняемый файл, раздел данных, ... также загружается в память.Кроме того, потоки имеют свое собственное пространство стека.
Вы можете спросить, почему стек должен расти вниз.Ну, как я уже говорил, некоторые архитектуры делают наоборот: куча растет вниз, а стек растет вверх.Имеет смысл размещать стек и кучу на противоположных сторонах, поскольку это предотвращает перекрытие и позволяет обеим областям свободно расти, если у вас достаточно доступного адресного пространства.
Еще один правильный вопрос может быть: не предполагается ли программауменьшить / увеличить сам указатель стека?Как архитектура может навязывать программисту одно поверх другого?Почему это не так зависит от программы, как это зависит от архитектуры?Хотя вы можете в значительной степени бороться с архитектурой и каким-то образом убрать свой стек в противоположном направлении, некоторые инструкции, в частности call
и ret
, которые напрямую изменяют указатель стека, собираются принять другое направление, что приводит к путанице.