最重要的问题是:程序员如何确保他的非局部静态变量是通过静态初始化而不是通过动态初始化来初始化的?
由于总是进行零初始化,因此应该查看常量初始化。
3.6.2.2 对象 o 的常量初始值设定项是一个常量表达式,只不过它也可以调用 constexpr
o 及其子对象的构造函数,即使这些对象是
非文字类类型 [ 注意:这样的类可能有一个不平凡的
析构函数——尾注]。执行常量初始化:
— 如果每个完整表达式(包括隐式转换)
出现在静态或线程引用的初始值设定项中
存储持续时间是一个常量表达式(5.19),引用是
绑定到指定具有静态存储持续时间的对象的左值
或临时的(见12.2);
— 如果具有静态或线程存储持续时间的对象是已初始化
通过构造函数调用,并且如果初始化完整表达式是
对象的常量初始值设定项;
— 如果具有静态或线程存储持续时间的对象是不是
由构造函数调用初始化,并且如果该对象是
值初始化 or 其中出现的每一个完整表达式
初始化器是一个常量表达式.
我省略了参考文献,因为它对我来说并不重要。如何I理解的标准是有3种情况:
- ctor
- 无向量和值初始化
- 无向量和常量表达式
假设我有以下课程:
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 部分中。
初始化,正如你所知,只是为了在第一次使用内存之前确保内存中的特定内容。如果您没有定义分配动态内存的构造函数,那么将不会有任何动态分配(如果这是您关心的问题)。
对于简单的构造函数,我相信编译器将生成内联代码并使用相同的代码在编译时初始化对象(我不确定标准谈论了什么,但它可能依赖于工具链。) ,非局部静态对象将在图像加载到内存中时初始化,局部静态对象将在加载堆栈帧时初始化。在任何情况下,您应该在首次使用之前找到处于已知状态的对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)