c/c ++优化调用函数中的常量变量

kei*_*yip 6 c c++ optimization avr constants

只有在使用-Os,-O1和-O2时,C/C++编译器才能使用常量参数(编译时已知)优化单层函数.他们没有优化所有层.只有-O3可以做到这一点.gcc是WinAVR 4.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
}
Run Code Online (Sandbox Code Playgroud)

除以下之外,有哪些可能的解决方案?

  1. -O3保存程序或文件(误用会炸掉大小)
  2. 属性优化-O3为函数(4.3.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);
Run Code Online (Sandbox Code Playgroud)

f1已经过优化,但发出警告'_delay_us'是静态的,但在内联函数'f1'中使用,由于静态函数问题,它不是静态的.其他人没有优化.


解:

static inline void outer(double) __attribute__((always_inline));
Run Code Online (Sandbox Code Playgroud)

内联是关键.我的外部函数对于内联来说太大了.属性always_inline强制函数内联.这允许编译器以比编写优化更少的编译成本来优化函数.-O3足够聪明,可以进行优化但不是-Os.-Os可能需要一些编译器选项.(关键字static是必需的,因为内部函数也是静态内联的.)

Pau*_*l R 3

有点类似于宏选项 (3),但没有宏的缺点,您可以创建特定的函数inline,这通常会导致所需的常量优化。当然,这只在您从一个地方(或从几个地方)调用相关函数时才有帮助,否则代码膨胀就会成为问题。

请注意,gcc 提供了强制特定内联函数始终内联的规定(而不是将其留给编译器自行决定):__attribute__ ((always_inline))。其他编译器通常具有类似的机制,尽管它可能是命令行开关或编译指示。