Пока компилятор C может видеть определение func
, он может 1 реализовать func
без использования стекового пространства.Например, когда он видит вызов func
, он может реализовать это, испустив одну или две команды, чтобы переместить 10 в a
.Это дало бы тот же результат, что и вызов func
в качестве подпрограммы, поэтому правила C позволяют реализации C реализовать вызов func
таким образом и не использовать пространство стека.
Как правило, если компилятор не может увидеть определение func
, как при компиляции другого исходного файла, который вызывает func
, но не определяет его, компилятор должен будет выполнить инструкцию вызова или что-то подобное, и это произойдет припо крайней мере, поместите адрес возврата в стек.
Кроме того, если вызываемая подпрограмма была более сложной, компилятор может решить не реализовывать ее встроенным образом или не сможет это сделать.(Например, если func
содержит вызовы к себе, компилятор, как правило, не может реализовать его со встроенным кодом во всех ситуациях; компилятор должен будет реализовать его с помощью актуальных инструкций вызова подпрограммы, которые используют пространство стека.)
Сноска
1 Вопрос о том, будет ли какой-либо конкретный компилятор реализовывать func
без использования стекового пространства, зависит от компилятора, параметров, используемых для компиляции, идругие факторы.