Почему статические функции иногда имеют нестандартные стековые фреймы?
В викибук 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
,
У меня есть следующие вопросы относительно вышеприведенного заявления:
- Возможно ли, чтобы внешняя функция ссылалась на статическую функцию, используя указатель на функцию? Если да, то как? Почему это разрешено? (Я спрашиваю об этом, потому что, насколько я знаю, статические функции имеют локальную область и не могут быть доступны никаким внешним функциям)?
- Что означает наличие нестандартного стекового фрейма? Чем отличаются нестандартные кадры стека от стандартных? Объяснение с использованием ассемблерного кода приветствуется:)
Изменить: Другой вопрос, на который я хотел бы получить ответ: почему компилятор в вышеупомянутом случае устанавливает нестандартный кадр стека вместо стандартного?
1 ответ
- Конечно, до тех пор, пока это другая функция в том же модуле перевода, которая берет указатель на статическую функцию и передает ее коду в другом модуле перевода. Функция где-то, в конце концов. Делая это
static
не позволяет другим объектам найти его, но не мешает передать его. - Например, не нужно выдвигать или выдвигать аргументы, или возвращаемое значение хранится там, где нравится компилятору. По сути, где-то между стандартным соглашением о вызовах и включением тела функции. Хотя включение функции тела является наиболее вероятным результатом.