Вопрос, который вы на самом деле задаете: «Почему компиляторы C и C ++ используют аппаратный стек для хранения переменных с автоматическим экстентом?»
Как уже упоминалось, ни в определениях языка C, ни C ++ явно не сказано, что переменные должны храниться в стеке.Они просто определяют поведение переменных с различной продолжительностью хранения:
6.2.4 Продолжительность хранения объектов
1 Объект имеет длительность хранения , определяющая его срок службы.Существует три срока хранения: статический, автоматический и распределенный.Выделенное хранилище описано в 7.20.3.
2 время жизни объекта - это часть выполнения программы, в течение которой хранилище гарантированно будет зарезервировано для него.Объект существует, имеет постоянный адрес , 25) и сохраняет свое последнее сохраненное значение в течение всего срока его жизни. 26) Если объект упоминается вне его времени жизни, поведениене определено.Значение указателя становится неопределенным, когда объект, на который он указывает, достигает конца своего времени жизни.
3 Объект, идентификатор которого объявлен с внешней или внутренней связью или со спецификатором класса хранения static
, имеет статическая продолжительность хранения .Его время жизни - полное выполнение программы, и его сохраненное значение инициализируется только один раз, до запуска программы.
4 Объект, идентификатор которого объявлен без связи и без спецификатора класса хранения static
, имеет длительность автоматического хранения .
5 Для такого объекта, у которого нет типа массива переменной длины, его время жизни простирается от входа в блок, с которым он связан, до завершения выполнения этого блокав любом случае.(Ввод закрытого блока или вызов функции приостанавливает, но не прекращает выполнение текущего блока.) Если блок вводится рекурсивно, каждый раз создается новый экземпляр объекта.Начальное значение объекта не определено.Если для объекта указана инициализация, она выполняется каждый раз, когда достигается объявление при выполнении блока;в противном случае значение становится неопределенным при каждом достижении декларации.
Стандарт языка C, черновик n1256 .
Нет сомнений в том, что параграф 5 был написан с учетом аппаратных стеков, но есть чудные архитектуры, которые не используютаппаратный стек, по крайней мере, не так, как в x86.Аппаратный стек просто делает поведение, указанное в параграфе 5, простым в реализации.