在优化的代码中是否调用了空函数
Is an empty function called at all in optimised code?
如果没有定义TEST宏,我想知道这两段代码中是否存在性能差异:
void Func1(int a) {
// ...
}
#ifdef TEST
Func1(123);
#endif
和:
void Func2(int a) {
#ifdef TEST
// ...
#endif
}
Func2(123);
如果没有定义TEST
,Func2
将成为编译器根本不应该调用的空函数,不是吗?
这在很大程度上取决于对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语言标准没有对什么应该优化,什么不应该优化做出任何声明。(尽管我承认我没有读过语言规范本身。(
每个编译器都有自己的一组选项,用于启用/禁用特定的优化步骤。
因此,答案是肯定的"这取决于","你必须检查自己才能确定"。
(然而,如果一个半吊子的优化器不优化这样的结构,我会非常惊讶。(
相关文章:
- 如何用参数值调用函数(仅在运行时已知)
- 从python中调用C++函数并获取返回值
- 当使用通配符和null指针调用函数时,对输出的说明
- 从R调用C++函数并对其进行集成时出错
- 使用QTreeView,如何通过调用函数只突出显示特定的行/列
- 如何在qt中从另一个类调用函数
- 在 COUT 语句中使用 COUT 调用函数
- 如何从线程中的不同模块调用函数?
- C++从函数指针数组调用函数
- 当 A 在 for 循环中调用函数 B 时,如何计算函数 A 的空间复杂度?
- 如何在 C/C++ 中从外部库调用函数
- 如何使用运算符在同一行中多次调用函数
- 是否可以创建一个从不同类调用函数的线程?
- 无法为类成员调用函数
- 如何从另一个标头 c++ 调用函数
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 如何只允许在调用函数 B 后调用函数 A?
- 我可以这样调用函数吗?
- 如何在 c++ 的类中递归调用函数方法?
- 为什么在指向对象的迭代器上调用函数不允许我更改对象本身?