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

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将成为编译器根本不应该调用的空函数,不是吗?

谢谢.

Ste*_*sop 7

它几乎归结为是否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)