GCCは、C ++コードをコンパイルするときに、inline
キーワードでマークされていない関数をインライン化することを選択して、速度を最適化しようとしますか?
4 に答える
はい。どのコンパイラも、それが良い考えであると考えるときはいつでも、どの関数も自由にインライン化できます。GCCもそれを行います。
最適化レベルで-O2
は、コンパイラーが実行する価値があると判断した場合(ヒューリスティックが使用されます)、およびコードのサイズが増加しない場合に、インライン化が実行されます。これ-O3
は、コードのサイズが大きくなるかどうかに関係なく、コンパイラーが実行する価値があると判断したときに実行されます。さらに、最適化のすべてのレベル(つまり、有効化された最適化)で、一度だけ呼び出される静的関数がインライン化されます。
以下のコメントに記載されているように、これら-Ox
は実際には、インライン化関連の設定(など)を含む複数のより具体的な設定を含む複合設定である-finline-functions
ため、これらのより具体的な設定の観点から動作を説明(および制御)することもできます。
はい。特に、高レベルの最適化を有効にしている場合はそうです。
これを無効にするためにコンパイラに提供できるフラグがあります:-fno-inline-functions。
'-finline-functions'または'-O3'を使用すると、関数がインライン化されます。'-finline_limit = N'を使用して、インライン化の量を調整することもできます。
はい。ただし、他の変換ユニットからの呼び出しに必要なため、static
非関数の非インライン関数本体も生成されます。inline
inline
関数の場合、関数が特定の変換単位で使用されている場合、関数本体を提供できないとエラーになるため、これは問題ではありません。