我遇到以下规则(3.7.1 / 2 N3797):
如果具有静态存储持续时间的变量具有初始化或具有副作用的析构函数,则即使它看起来未使用,也不应将其消除,除非可以按照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对象?
嗯,这就是标准所说的,所以...是的。
与往常一样,有一个as-if规则,只要最终效果是相同的,它允许编译器执行几乎所有操作。我可以想象,如果该类在数据方面是巨大的,但是构造函数和析构函数(以及其他任何人)不访问该数据,则编译器可以按正确的顺序调用该构造函数和析构函数,而不会为未使用的数据留出空间。
就您的示例而言,您在声明 Y::m
,但从未定义。因此它不存在。如果尝试访问它,则会收到链接器错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句