是否在优化代码中调用了一个空函数?

时间:2011-07-01 11:39:43

标签: c++ optimization performance runtime

如果未定义TEST宏,我想知道这两段代码是否存在性能差异:

void Func1(int a) {
    ...
}

#ifdef TEST
Func1(123);
#endif

void Func2(int a) {
#ifdef TEST
    ...
#endif
}

Func2(123);

如果未定义TEST,Func2将成为编译器根本不应该调用的空函数,不是吗?

谢谢。

2 个答案:

答案 0 :(得分:6)

这几乎可归结为对Func2的特定呼叫是否内联。如果是,则优化编译器应该能够对空函数进行内联调用,就像根本不调用它一样。如果它没有内联,那么它会被调用并立即返回。

只要函数定义在包含对Func2的调用的TU中可用,就没有明显的理由不会内联。

这一切都依赖于123是一个文字的事实,所以评估你的调用的参数没有副作用。即使函数调用无效,也必须计算args,所以:

int i = 0;

/* 'i' is incremented, even if the call is optimized out */
Func2(++i);

/* 'i' is not incremented when 'TEST' is undefined */
#ifdef TEST
Func1(++i);
#endif

答案 1 :(得分:2)

优化通常是特定于编译器的。 AFAIK的语言标准没有做出关于应该和不应该优化的内容的任何陈述。 (虽然我承认我还没有阅读语言规范本身。)

每个编译器都有自己的一组选项,通过这些选项可以启用/禁用特定的优化步骤。

所以答案是肯定的“它取决于”,“你必须检查自己以确定”。

(但是,如果一个中等优秀的优化器会让这样的结构不被优化,我会感到非常惊讶。)