По понятным причинам компилятор C должен скомпилировать все функции, видимые извне для других разделяемых библиотек, чтобы они соответствовали соглашениям о вызовах платформы и другим требованиям ABI. Однако я узнал, что это не обязательно нужно делать для функций, которые могут быть гарантированно никогда не вызваны из внешних модулей.
Как и когда компилятор может определить, верно ли это для данной функции?
Статическая функция видна только другим функциям в той же единице компиляции и, следовательно, является хорошим кандидатом для таких оптимизаций, нарушающих ABI. Но указатели функций на статическую функцию все еще могут быть переданы другим модулям. Пытается ли компилятор определить, передаются ли где-либо в коде указатели на функции?
Компилятор gcc имеет некоторые расширения, которые позволяют символы должны быть объявлены как используемые по умолчанию, скрытые или даже внутренние, и в документации особо упоминается, что эта информация может использоваться для выполнения некоторых видов оптимизации, которые невозможны для видимых извне функций. Что произойдет, если указатель функции будет передан внешнему коду для функции, аннотированной как внутренняя?
Каков наилучший способ помочь компилятору выполнить как можно больше оптимизаций, при этом гарантируя совместимость с другими библиотеками? Должен ли я просто использовать параметр компилятора, чтобы определить все функции как внутренние и переопределить это с помощью атрибута для всех функций, которые должны быть видны извне?