消除静态存储持续时间的变量

时间:2014-07-10 14:03:37

标签: c++ storage-duration

我遇到了以下规则(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()
{
}

IdeOne

为什么data_member对象没有在示例中构造?

1 个答案:

答案 0 :(得分:1)

嗯,这就是标准所说的,所以......是的。

与往常一样,只要净效果相同,就可以使用as-if规则,允许编译器执行任何操作。我可以想象,如果类是数据量巨大,但构造函数和析构函数(以及其他任何人)不访问该数据,编译器可以按正确的顺序调用构造函数和析构函数,而不会为未使用的数据留出空间


至于您的示例,您声明 Y::m,但您从未定义它。所以它不存在。如果您尝试访问它,则会出现链接器错误。