最適化をオンにして実行gcc
すると、関数がホット パスにあるか、関数の引数に伝播する定数があると見なされると、C 関数のクローン (複製) が作成されます。
より具体的には、これはfipa-cp-clone
オプションによって制御されているようです。
これに影響を与える方法はありますか?たとえば、関数が複製される原因となるコンパイル時定数として (テンプレート パラメーターを使用して C++ で行うことができるように) 1 つのパラメーターを何らかの属性でマークしますか?
最適化をオンにして実行gcc
すると、関数がホット パスにあるか、関数の引数に伝播する定数があると見なされると、C 関数のクローン (複製) が作成されます。
より具体的には、これはfipa-cp-clone
オプションによって制御されているようです。
これに影響を与える方法はありますか?たとえば、関数が複製される原因となるコンパイル時定数として (テンプレート パラメーターを使用して C++ で行うことができるように) 1 つのパラメーターを何らかの属性でマークしますか?
重要なのは、関数が定数引数 (実際の定数式、または定数伝播によってコンパイラによって定数であると判断されたもの) で呼び出されるかどうかです。この場合、GCC は、コストがかかりすぎるかメリットが少なすぎると判断しない限り、関数を複製します。その指標に影響を与える方法がわかりません。一度にプログラム全体をコンパイルするか、リンク時の最適化を使用しない限り、一定の伝播は単一の翻訳単位 (ソース ファイル) 内でのみ発生することに注意してください。
私の推測では、クローン作成が発生するはずのときに発生しない場合、GCC は関数が呼び出される定数引数を認識していないということです。一定であることがわかっていても、コンパイラはそれを証明できない場合があります。