在优化的代码中是否调用了空函数

Is an empty function called at all in optimised code?

本文关键字:调用 函数 是否 优化 代码      更新时间:2023-10-16

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

void Func1(int a) {
   // ...
}
#ifdef TEST
Func1(123);
#endif

和:

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

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

这在很大程度上取决于对Func2的特定调用是否内联。如果是,那么优化编译器应该能够对空函数进行内联调用,就像根本不调用它一样。如果它没有内联,那么它会被调用并立即返回。

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

这一切都依赖于123是一个文字,因此评估调用的参数没有副作用。即使函数调用没有效果,也必须评估参数,因此:

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

优化通常是特定于编译器的。AFAIK语言标准没有对什么应该优化,什么不应该优化做出任何声明。(尽管我承认我没有读过语言规范本身。(

每个编译器都有自己的一组选项,用于启用/禁用特定的优化步骤。

因此,答案是肯定的"这取决于","你必须检查自己才能确定"。

(然而,如果一个半吊子的优化器不优化这样的结构,我会非常惊讶。(