В wikibook x86 Disassembly
написано, что иногда есть подпрограммы, которые не устанавливают стандартные стековые фреймы. Один из таких случаев - это когда мы объявляем статическую функцию в C. В книге написаны следующие строки.Почему статические функции иногда имеют нестандартные фреймы стека?
When an optimizing compiler sees a static function that is only referenced by calls (no references through function pointers), it "knows" that external functions cannot possibly interface with the static function (the compiler controls all access to the function), so the compiler doesn't bother making it standard
.
я следующие вопросы относительно вышеупомянутого заявления:
- Возможно ли внешняя функция для обозначения статической функции с помощью указателя функции? Если да, то как? Почему это разрешено? (Я спрашиваю об этом, поскольку, насколько мне известно, статические функции имеют локальную область действия и к ним не могут обращаться никакие внешние функции)?
- Что означает наличие нестандартного фрейма стека? Как нестандартные рамки стека отличаются от стандартных? Объяснение с использованием ассемблерного кода было бы приветствуемым :)
Редактировать: Еще один вопрос, на который мне хотелось бы ответить: Почему компилятор в вышеупомянутом случае настроил нестандартный стек кадров вместо стандартного?
Могут ли внешние функции вызывать статическую функцию через указатель функции? – crisron
@crisron: да, тогда внешняя функция может вызвать статическую функцию через указатель функции. Как сказал Снефтел: внешний код не может найти его по имени, но он может быть анонимно показан через указатель на функцию, и его можно так назвать. –
@ RudyVelthuis: Почему это разрешено? – crisron