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

时间:2011-01-31 08:23:38

标签: c++ c optimization constants avr

只有在使用-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
}

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

  1. -O3保存程序或文件(误用会炸掉大小)
  2. 属性优化-O3用于函数(4.3.3不支持)
  3. 宏(容易出错)

  4. 更新

    //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是必需的,因为内部函数也是静态内联的。)

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

至少在GCC中,-O 标志只是打开了一大堆其他标志,例如http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html。你可以启用你感兴趣的那些,虽然这通常是不鼓励的。

请注意,我不确定例如-O2-O3的GCC必然是完全不同的编译器将做什么的任何指标。

答案 2 :(得分:0)

一般来说,如果增加提供给编译器的信息,那么它可能能够执行更好的优化。

例如,假设这些是对innerouter的唯一调用,那么您可以将它们声明为static以限制其范围并允许编译器更灵活地优化它们。

根据函数的实际内容,您可以将它们的参数声明为const,这样可以让编译器立即知道如果不必分析代码就无法更改它们

static void inner(const double value)
{
    //operations using value
}

static void outer(const double value)
{
    //few operations using value
    //...
    inner(value);
}

答案 3 :(得分:0)

如何引入一个函数“outerFast”,在其自己的cpp中定义,包括innerouter的定义,并仅使用-O3编译该文件?

但它有其自身的缺点。