C / C ++コンパイラーは、-Os、-O1、および-O2を使用する場合にのみ、定数パラメーター(コンパイル時に既知)を使用して単層関数を最適化します。すべてのレイヤーを最適化するわけではありません。-O3だけがそれを行うことができます。gccはWinAVR4.3.3であり、属性「optimize」をサポートしていません。
void inner(double value)
{
//operations using value
//...
}
void outer(double value)
{
//few operations using value
//...
inner(value);
}
int main()
{
inner(1); //optimize
outer(1); //only optimize by using -O3
}
以下以外の可能な解決策は何ですか?
- -O3ホールドプログラムまたはファイル(誤用するとサイズが大きくなります)
- 関数の属性optimize-O3(4.3.3はサポートしていません)
- マクロ(エラーが発生しやすい)
アップデート:
//inner function
static inline void _delay_us(double __us) __attribute__((always_inline));
//outer function
void f(double);
inline f1(double);
static inline f2(double);
static f3(double);
f1は最適化されていますが、警告'_delay_us'は静的ですが、静的関数の問題のために静的ではないインライン関数'f1'で使用されています。その他は最適化されていません。
解決:
static inline void outer(double) __attribute__((always_inline));
インラインが鍵です。私の外部関数はインラインには大きすぎます。属性always_inlineは、関数を強制的にインライン化します。これにより、コンパイラーは、最適化を理解しようとするよりも少ないコンパイルコストで関数を最適化できます。-O3は、最適化を実行するのに十分スマートですが、-Osは実行できません。-OSにはいくつかのコンパイラオプションが必要な場合があります。(内部関数も静的インラインであるため、キーワードstaticが必要です。)