如果未定义TEST宏,我想知道这两段代码是否存在性能差异:
void Func1(int a) {
...
}
#ifdef TEST
Func1(123);
#endif
和
void Func2(int a) {
#ifdef TEST
...
#endif
}
Func2(123);
如果未定义TEST,Func2将成为编译器根本不应该调用的空函数,不是吗?
谢谢。
答案 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的语言标准没有做出关于应该和不应该优化的内容的任何陈述。 (虽然我承认我还没有阅读语言规范本身。)
每个编译器都有自己的一组选项,通过这些选项可以启用/禁用特定的优化步骤。
所以答案是肯定的“它取决于”,“你必须检查自己以确定”。
(但是,如果一个中等优秀的优化器会让这样的结构不被优化,我会感到非常惊讶。)