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

标签 c++ c optimization constants avr

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
}

除了以下几种可能的解决方案还有哪些?

  1. -O3 hold program or file(误用会导致体积膨胀)
  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);

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/

相关文章:

python - 在 PyTorch 中快速计算模型参数的 Hessian 矩阵

c++ - 混合使用 C 和 C++ 代码会在 GCC 中产生意外行为

c++ - 如何在 C++ 中保留未定义的声明函数,如 Haskell 中的 `undefined`?

在 C 中创建大型数组

可以使用 strcpy 但不能使用 strcat 的情况

java - 如何改进生成多重集组合的算法?

c++ - 如何在 C++ 中为我自己的集合类添加 foreach 迭代支持?

c++ - 是否可以在 GA144 上运行仿真的 C 代码?

c - 乘法口诀表 - C

python - 棋盘游戏:找到带有限制的红点的最大绿点