我知道 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)
中(假设它们还没有),尽管函数体是空的。
感谢您的任何建议!