C/C++ 编译器仅在使用 -Os、-O1 和 -O2 时使用常量参数(在编译时已知)优化单层函数。它们不会优化所有层。只有 -O3 可以做到这一点。gcc 是 WinAVR 4.3.3,它不支持属性“优化”。
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 保存程序或文件(滥用会炸毁大小)
- 函数的属性优化-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 是必需的,因为内部函数也是静态内联的。)