只有在使用-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
}
除以下情况外,有哪些可能的解决方案?
更新
//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是必需的,因为内部函数也是静态内联的。)
答案 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)
一般来说,如果增加提供给编译器的信息,那么它可能能够执行更好的优化。
例如,假设这些是对inner
和outer
的唯一调用,那么您可以将它们声明为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中定义,包括inner
和outer
的定义,并仅使用-O3编译该文件?
但它有其自身的缺点。