1

我遇到了以下规则(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 对象?

4

1 回答 1

1

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

与往常一样,有一个 as-if 规则,只要最终效果相同,编译器几乎可以做任何事情。我可以想象,如果该类在数据方面是巨大的,但构造函数和析构函数(以及其他任何人)不访问该数据,编译器可以按正确的顺序调用构造函数和析构函数,而不为未使用的数据留出空间.


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

于 2014-07-10T14:08:57.677 回答