Pie*_*tro 12 c++ optimization performance runtime
如果未定义TEST宏,我想知道这两段代码是否存在性能差异:
void Func1(int a) {
...
}
#ifdef TEST
Func1(123);
#endif
Run Code Online (Sandbox Code Playgroud)
和:
void Func2(int a) {
#ifdef TEST
...
#endif
}
Func2(123);
Run Code Online (Sandbox Code Playgroud)
如果未定义TEST,Func2将成为编译器根本不应该调用的空函数,不是吗?
谢谢.
它几乎归结为是否Func2
内联的特定调用.如果是,则优化编译器应该能够对空函数进行内联调用,就像根本不调用它一样.如果没有内联,那么它会被调用并立即返回.
只要函数定义在包含调用的TU中可用Func2
,就没有明显的理由它不会被内联.
这一切都依赖于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
Run Code Online (Sandbox Code Playgroud)