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 hold program or file(误用会导致体积膨胀)
- 函数属性优化-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' is static but used in inline function 'f1' which is not static due to static function problem.其他没有优化。
解决方法:
static inline void outer(double) __attribute__((always_inline));
内联是关键。我的外部函数对于内联来说太大了。属性 always_inline 强制函数内联。这允许编译器以比试图找出优化更少的编译成本来优化函数。 -O3 足够聪明,可以进行优化,但 -Os 不行。 -Os 可能需要一些编译器选项。 (关键字 static 是必需的,因为内部函数也是静态内联的。)
最佳答案
有点类似于宏选项 (3),但没有宏的缺点,您可以使特定函数内联
,这通常会导致所需的常量优化。当然,这仅在您从一个地方(或几个地方)调用相关函数时才有用,否则代码膨胀将成为一个问题。
请注意,gcc 有一个强制特定内联函数始终被内联的规定(而不是让编译器自行决定):__attribute__ ((always_inline))
。其他编译器通常会有类似的机制,尽管它可能是命令行开关或编译指示。
关于c++ - c/c++ 优化调用函数中的常量变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4848847/