gpt4 book ai didi

c++ - 消除具有静态存储持续时间的变量

转载 作者:太空宇宙 更新时间:2023-11-04 11:31:15 24 4
gpt4 key购买 nike

我遇到了以下规则 (3.7.1/2 N3797):

If a variable with static storage duration has initialization or a destructor with side effects, it shall not be eliminated even if it appears to be unused, except that a class object or its copy/move may be eliminated as specified in 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对象?

最佳答案

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

与往常一样,存在假设规则,允许编译器执行几乎任何操作,只要最终效果相同即可。我可以想象,如果类在数据方面很大,但构造函数和析构函数(以及其他任何人)不访问该数据,编译器可以按正确的顺序调用构造函数和析构函数,而不会为未使用的数据留出空间.


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

关于c++ - 消除具有静态存储持续时间的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24678646/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com