Компилятору (C или C ++) сложно организовать каждый фрейм вызова.
При преобразовании машинного кода, связанного с локальной переменной в вашем исходном коде, он переводит доступ и изменения локальных переменных в подходящие инструкции (часто с использованием указателя стека или фрейма в качестве некоторой базы).
Заданное местоположение в кадре вызова может (и обычно используется при оптимизации компилятора) использоваться для нескольких целей.
Некоторые локальные переменные не имеют контраргументов в кадре вызова: они существуют только в регистрах. Другие иногда разливаются. Хороший распределитель регистров изо всех сил пытается избежать разливов.
Расположение кадра вызова, распределение регистров, планирование инструкций - сложные задачи оптимизирующего компилятора.
Если вам интересно узнать немного о вашем наборе команд процессора x86, вы можете попробовать написать крошечный файл C ++ tiny.cc
и скомпилировать его с помощью g++ -Wall -fverbose-asm -O -S tiny.cc
, а затем посмотреть на сгенерированный tiny.s
, например, с помощью. редактор типа gedit
или emacs
или пейджер типа less
.