我遇到了以下规则(3.7.1 / 2 N3797):
如果具有静态存储持续时间的变量具有初始化或a 具有副作用的破坏者,即使它也不会被消除 似乎未使用,除了类对象或其复制/移动可能 按照12.8的规定予以淘汰。
是否真的,如果我们声明一个具有静态存储持续时间的变量,具有副作用的构造函数或析构函数,那么即使它未被使用,内存也将为该变量分配?
特别是,我正在尝试使用以下代码:
#include <csignal>
#include <iostream>
#include <cstdlib>
using std::cout;
struct data_member
{
data_member(){ cout << "data_member\n"; }
~data_member(){ cout << "~data_member\n"; }
};
struct Y
{
static data_member m;
Y(){ cout << "Y\n"; }
~Y(){ cout << "~Y\n"; }
};
Y y;
int main()
{
}
为什么data_member对象没有在示例中构造?
答案 0 :(得分:1)
嗯,这就是标准所说的,所以......是的。
与往常一样,只要净效果相同,就可以使用as-if规则,允许编译器执行任何操作。我可以想象,如果类是数据量巨大,但构造函数和析构函数(以及其他任何人)不访问该数据,编译器可以按正确的顺序调用构造函数和析构函数,而不会为未使用的数据留出空间
至于您的示例,您声明 Y::m
,但您从未定义它。所以它不存在。如果您尝试访问它,则会出现链接器错误。