编译器何时会优化掉静态成员变量?以下是我的代码:
#include <iostream>
#include <typeinfo>
class X {
public:
X(const char* s) { std::cout << s << "\n"; };
};
template <class S> class Super {
protected:
Super() { (void)m; };
static inline X m { typeid(S).name() };
};
class A : Super<A> {
};
class B : Super<B> {
B() {};
};
class C {
static inline X m { "c" };
};
A a {};
int main() { return 0; }
我可以看到的输出是,Super<A>::m
、Super<B>:m
和C::m
都已经被初始化。
如果删除语句A a {};
,Super<A>::m
就不会被初始化。这是有意义的,因为m从未被访问。然而,这并不能解释为什么对于B和C没有被删除。
这种行为是指定的还是编译器检测未使用变量的产物?
int
成员也同样容易看到。可能编译器不允许省略已存在对象的构造函数调用;允许在某些情况下跳过复制构造函数的规则是特定于复制构造的。你的测试案例正在寻找可见副作用(cout <<
)的变化,而不仅仅是优化一些未被引用的存储。 - Peter Cordesstatic int
成员的存储?那么应该加上[language-lawyer]标签,因为C++标准必须明确允许这种优化,而不是通过as-if规则。 - Peter CordesC
和Super
是不同的情况,因为模板遵循不同的排序规则。 - Goswin von Brederlow