gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:39:01 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com