gpt4 book ai didi

c++ - 保证静态对象的静态(常量)初始化

转载 作者:IT老高 更新时间:2023-10-28 13:01:44 24 4
gpt4 key购买 nike

首要问题是:程序员如何确保他的非局部静态变量是通过静态初始化而不是通过动态初始化来初始化的?

由于总是进行零初始化,因此应该查看常量初始化。

3.6.2.2 A constant initializer for an object o is an expression that is a constant expression, except that it may also invoke constexpr constructors for o and its subobjects even if those objects are of non-literal class types [ Note: such a class may have a non-trivial destructor —end note ]. Constant initialization is performed:

— if each full-expression (including implicit conversions) that appears in the initializer of a reference with static or thread storage duration is a constant expression (5.19) and the reference is bound to an lvalue designating an object with static storage duration or to a temporary (see 12.2);

— if an object with static or thread storage duration is initialized by a constructor call, and if the initialization full-expression is a constant initializer for the object;

— if an object with static or thread storage duration is not initialized by a constructor call and if either the object is value-initialized or every full-expression that appears in its initializer is a constant expression.

我省略了引用,因为它对我来说并不重要。 怎么理解的标准是有3种情况:

  1. Actor
  2. no-ctor 和值初始化
  3. no-ctor 和常量表达式

假设我有以下类(class):

struct X {
bool flag = false;
// = {} will break VS2013 CTP so in that case use the
// regular ctor, which sadly still can't be declared constexpr
std::aligned_storage<sizeof(int), alignof(int)>::type storage = {};
};

据我所知,这个类对于常量初始化是完全有效的(每个元素都可以持续初始化)。这是真的吗?

这个类是否需要 constexpr 构造函数?

C++11 和 C++98 是否保证常量初始化?

附带问题:如果是so/dll,什么时候会进行静态初始化?在加载期间,或者可能会进一步延迟?

最佳答案

最好知道这个问题背后的目的。还有您关心的是分配还是特别是初始化。

但是,初始化的类型并不重要,因为所需的空间是在编译时分配的。根据您定义变量的方式,它最终会出现在 .bss 或 .data 部分中。

如您所知,初始化只是为了确保内存中的特定内容在首次使用之前。如果您没有定义分配动态内存的构造函数,则不会有任何动态分配(如果您担心的话)。

对于简单的构造函数,我相信编译器会生成内联代码并在编译时使用它来初始化对象(我不确定标准是怎么说的,但它可能依赖于工具链。)使用复杂的构造函数,非本地静态对象将在图像加载到内存时初始化,本地静态对象将在加载堆栈帧时初始化。在任何情况下,您都应该在首次使用之前找到处于已知状态的对象。

关于c++ - 保证静态对象的静态(常量)初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26175697/

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