Вот это, кстати, интересный момент.
Немногие задумывались, почему большинство компиляторов (в том числе для x86 или ARM) размещают локальные переменные в стеке.
А дело здесь в рекурсии. В языке C разрешена рекурсия - и поэтому компилятор исходит из того, что любая функция может быть рекурсивной. А для рекурсивных функций иного выхода и нет, кроме как организовать стек для хранения локальных переменных.
Иногда компилятор может доказать, что та или иная функция не вызывает сама себя - ни прямо, ни через другие функции. Для таких функций он может отказаться от использования стека, а для прочих - нет. Вызов функции по указателю - это один из случаев, когда компилятор всегда должен подразумевать возможную рекурсию, ведь он не знает, что будет вызвано. Будет ли код, вызывающий функцию по указателю, вызван впоследствии рекурсивно.
В этом смысле более эффективен Фортран, где рекурсия запрещена, и компиляторы имеют полную свободу оптимизации.
Рекурсия иногда нужна, поэтому лучшим решением я бы считал введение атрибутов для функций, которые программист не собирается вызывать рекурсивно. Аналогично тому, как в GCC можно задать функциям атрибут, что они никогда не возвращаются.





Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 
