明らかな理由から、C コンパイラは、他の共有ライブラリから外部的に見えるすべての関数をコンパイルして、プラットフォームの呼び出し規則やその他の ABI 要件に準拠する必要があります。ただし、外部モジュールから呼び出されないことが保証されている関数については、必ずしもそうする必要はないことを学びました。
コンパイラは、それが特定の関数に当てはまるかどうかをいつどのように判断できますか?
静的関数は、同じコンパイル ユニット内の他の関数からしか見えないため、このような ABI を破る最適化に適しています。ただし、静的関数への関数ポインターは、他のモジュールに引き続き渡すことができます。コンパイラは、関数ポインタがコードのどこかに渡されているかどうかを判断しようとしますか?
gcc コンパイラには、シンボルをデフォルト、非表示、または内部として宣言できる拡張機能がいくつかあります。ドキュメントでは、この情報を使用して、外部から見える関数では不可能なある種の最適化を実行できると具体的に述べています。内部として注釈が付けられた関数の外部コードに関数ポインタが渡されるとどうなるでしょうか?
他のライブラリとの相互運用性を保証しながら、コンパイラが可能な限り多くの最適化を実行できるようにする最善の方法は何でしょうか? コンパイラ オプションを使用してすべての関数を内部として定義し、それを外部から見えるようにする必要があるすべての関数の属性でオーバーライドする必要がありますか?