1

В 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.

я следующие вопросы относительно вышеупомянутого заявления:

  1. Возможно ли внешняя функция для обозначения статической функции с помощью указателя функции? Если да, то как? Почему это разрешено? (Я спрашиваю об этом, поскольку, насколько мне известно, статические функции имеют локальную область действия и к ним не могут обращаться никакие внешние функции)?
  2. Что означает наличие нестандартного фрейма стека? Как нестандартные рамки стека отличаются от стандартных? Объяснение с использованием ассемблерного кода было бы приветствуемым :)

Редактировать: Еще один вопрос, на который мне хотелось бы ответить: Почему компилятор в вышеупомянутом случае настроил нестандартный стек кадров вместо стандартного?

ответ

1
  1. Удостоверьтесь, что это еще одна функция в той же самой системе переводов, которая указала на статическую функцию и передала код в другую единицу перевода. Функция где-то, в конце концов. Выполнение этой задачи static не позволяет найти другие предметы, но это не помешает им получить ее.
  2. Никаких аргументов, например, нажатия или выскакивания, или возвращаемого значения не должно храниться везде, где это требуется компилятору. В основном, где-то между стандартным соглашением вызова и вложением тела функции. Хотя включение тела функции является наиболее вероятным результатом.
+0

Могут ли внешние функции вызывать статическую функцию через указатель функции? – crisron

+0

@crisron: да, тогда внешняя функция может вызвать статическую функцию через указатель функции. Как сказал Снефтел: внешний код не может найти его по имени, но он может быть анонимно показан через указатель на функцию, и его можно так назвать. –

+0

@ RudyVelthuis: Почему это разрешено? – crisron