问题标签 [storage-duration]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
54 浏览

c++ - 参考类型和存储期限

首先,我引用存储期限的定义(sec. 3.7.1/1 N3797):

存储持续时间是对象的属性,它定义了包含该对象的存储的最小潜在生命周期。

但是 3.7.1/3 说:

存储持续时间类别也适用于参考。

它很好奇。我认为引用在内存中根本没有表示。我还认为一个对象并且只有对象在内存中表示(第 1.8/1 节):

对象是一个存储区域。

将存储持续时间概念引入参考有什么意义?

0 投票
1 回答
367 浏览

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

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

如果具有静态存储持续时间的变量具有初始化或具有副作用的析构函数,则即使它看起来未使用,也不应将其消除,除非可以按照 12.8 中的规定消除类对象或其复制/移动。

如果我们声明一个具有静态存储持续时间的变量,具有具有副作用的构造函数或析构函数,那么即使该变量未使用,内存也会分配给该变量,这是真的吗?

特别是,我正在尝试使用以下代码:

理想一

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

0 投票
4 回答
925 浏览

c++ - 静态数据成员的初始化

为什么不发生静态数据成员的默认初始化?在下面的例子中

但是如果我们从中删除static说明符,data_member m它将被默认初始化。

0 投票
0 回答
53 浏览

c++ - 具有线程存储持续时间的非本地对象

不清楚为什么具有线程存储持续时间的对象没有默认初始化?例如:

理想一

stdout是空的。但我预计这stdout将包含

这是因为秒。8.5/12 N3797:

如果没有为对象指定初始化器,则该对象是默认初始化的

这并没有说明对象的存储持续时间。

0 投票
1 回答
892 浏览

c++ - 线程局部全局范围变量

考虑以下代码:

演示

由于a有线程存储持续时间,我们至少有三个不同的对象,用 a 和 used in和first线程表示。我们不使用inside 。是否有可以在第三个中使用的零初始化?我问这个问题是因为我在标准中找不到任何关于此的内容:secondmainathirda

作为线程执行的结果,具有线程存储持续时间的非局部变量被初始化。

是否定义了实现?

0 投票
1 回答
939 浏览

c++ - c++静态vs线程存储持续时间销毁顺序

考虑在 c++ 中如何有这两个存储持续时间(以及其他):静态存储持续时间和线程存储持续时间。.

接下来考虑这段代码:

另外假设“a”和“b”可能不在同一个编译单元中。我“相信”“b”的析构函数将在“a”之前调用,因为线程存储持续时间将首先终止,只有在完成后静态存储持续时间才会终止并调用“a”的析构函数。我一直在寻找对此的标准参考,但我一直找不到。有人可以通过权威人士专门证实这一点吗?

0 投票
1 回答
188 浏览

c++ - 具有用户定义的字符串文字的基础字符数据的存储持续时间

快速设置:我想在我的程序中传递字符串作为指针和大小。我有一个 String 类和一个用于构造文字字符串的用户定义文字:

标准是否指定传递给我的用户定义文字运算符的参数具有静态持续时间?即上面的代码实际上相当于写:

或者当我使用用户定义的文字时,编译器/链接器是否允许我留下一个悬空指针?

(N4527 的第 2.13.8 节似乎没有就用户定义的字符串文字运算符的参数的存储类主题发表任何内容。任何指向标准适当部分的指针都将不胜感激。)

0 投票
1 回答
347 浏览

c++ - C++ 默认初始化是否保留先前的零初始化?

如果具有静态存储持续时间的对象的 C++ 构造函数未初始化成员,是否需要保留先前的零初始化,或者它是否使成员具有不确定的值?

我对 C++ 规范的解读是它自相矛盾。

例子:

Foo() 构造函数没有显式初始化成员 object.x,因此根据 12.6.2 第 8 段中的注释:

该成员具有不确定的价值。

但是仔细研究各种初始化的细节,这似乎是不正确的。成员 object.x 是零初始化的,因为它具有静态存储持续时间,然后我看不到任何改变它的东西。

关于构造函数,适用的 12.6.2 中的文本是:

实体是默认初始化的。

在 8.5 第 7 段中,默认初始化的相关案例是:

... 不执行初始化

我读到这意味着默认初始化不会更改先前的零初始化。

我是否遗漏了其他一些在构造函数调用开始时将所有成员重置为“不确定值”的文本?

我在 stackoverflow 上发现了有关零初始化和默认初始化的各种其他问题,但我看不到任何分析默认初始化跟随同一实体的一些早期初始化时会发生什么的任何问题。

在这种情况下,可能没有实际效果。但是在一个更复杂的构造函数中,一些成员初始化而其他成员没有,编译器是否必须准确跟踪哪些字节/位被初始化?或者它可以只初始化整个对象(例如,将构造函数简化为 memset() 调用)?

0 投票
2 回答
869 浏览

c++ - C++中结构的存储持续时间和成员初始化

C++14 标准 (ISO/IEC 14882:2014) 第 8.5 节第 12 段:

如果没有为对象指定初始化程序,则该对象是默认初始化的。当获得具有自动或动态存储持续时间的对象的存储时,该对象具有不确定的值,如果没有对该对象执行初始化,则该对象将保留一个不确定的值,直到该值被替换(5.17)。[ 注意:具有静态或线程存储持续时间的对象是零初始化的,请参见 3.6.2。- 结束注]

那么a1有静态存储持续时间和a2自动存储持续时间吗?的定义Struct A在全局命名空间以及a1声明中,而a2声明在块范围内(在main()函数内部)。

此外,第 3.6.2 节说:

第 1 段:

作为程序启动的结果,具有静态存储持续时间的非局部变量被初始化。

第 2 段:

具有静态存储持续时间 (3.7.1) 或线程存储持续时间 (3.7.2) 的变量应在任何其他初始化发生之前进行零初始化 (8.5)。

此外,使用 gcc 5.4.0 我会收到警告 ( warning: 'a2.A::x' is used uninitialized in this function [-Wuninitialized]) 和随机值,但使用 clang 3.8.0 输出始终是a2.x = 0(零也可以是不确定的值)。我还做了其他更复杂的实验,将嵌套struct的 s 和默认初始化放在// Some Other Code. 有时我得到随机值,而其他时候(不是可以忽略的数量)我得到一个零。

  • 结构的存储期限是A多少?而对象a1a2?那变量a1.xa2.x

  • 应该a1.xa2.x初始化吗?还是它们是不确定的值?

  • 相同的规则是否适用于classunion

  • 里面的代码有什么区别// Some Other Code吗?例如,如果一个类 T“具有带有默认初始化程序的非静态成员”(如 in struct A { int b = 1; int x; };),那么默认构造函数就不能是微不足道的(即不能执行任何操作)。那个不平凡的构造函数也会初始化x吗?平凡的默认构造函数

有趣的链接:

C++ 结构初始化

初始化结构中的默认值

C++ 结构的成员是否默认初始化为 0?

C++ 中 POD 类型的默认初始化

在 C 与 C++ 中使用静态存储持续时间初始化对象

C 和 C++:自动结构的部分初始化

如何将结构初始化为所有元素零或空

0 投票
3 回答
1251 浏览

c - 在函数内部如何不重新分配静态变量

我对这个问题的答案有疑问,但我不能对此发表评论,因为我的代表少于 50。

我想知道答案foo()是否被多次调用并且静态变量被分配了相同的次数。那么为什么静态变量不是每次都重新赋值为 10 呢?