我知道 C++ 编译器会优化空(静态)函数。
基于这些知识,我编写了一段代码,只要我定义了一些标识符(使用-D编译器的选项),它就应该得到优化。考虑以下虚拟示例:
#include <iostream>
#ifdef NO_INC
struct T {
static inline void inc(int& v, int i) {}
};
#else
struct T {
static inline void inc(int& v, int i) {
v += i;
}
};
#endif
int main(int argc, char* argv[]) {
int a = 42;
for (int i = 0; i < argc; ++i)
T::inc(a, i);
std::cout << a;
}
期望的行为如下:无论何时NO_INC定义标识符(-DNO_INC在编译时使用),所有调用都T::inc(...)应该被优化掉(由于空函数体)。否则,调用T::inc(...)应该触发某个给定值的增量i。
我对此有两个问题:
- 我的假设是否正确,即
T::inc(...)在我指定选项时调用不会对性能产生负面影响,-DNO_INC因为对空函数的调用已优化? - 我想知道变量 (
a和i) 在被调用时是否仍然加载到缓存T::inc(a, i)中(假设它们还没有),尽管函数体是空的。
感谢您的任何建议!