首要问题是:程序员如何确保通过静态初始化而不是通过动态初始化来初始化他的非本地静态变量?
由于始终进行零初始化,因此应该查看常量初始化.
3.6.2.2对象的常量初始化器o是一个表达式,它是一个常量表达式,除了它也可以为o及其子对象调用constexpr构造函数,即使这些对象是非文字类类型[注意:这样的类可能有一个非平凡的析构函数 - 注意事项].执行常量初始化:
- 如果在具有静态或线程存储持续时间的引用的初始值设定项中出现的每个完整表达式(包括隐式转换)是常量表达式(5.19)并且引用绑定到指定具有静态存储持续时间的对象的左值或者临时的(见12.2);
- 如果具有静态或线程存储持续时间的对象由构造函数调用初始化,并且初始化full-expression是对象的常量初始化器 ;
- 如果具有静态或线程存储持续时间的对象未通过构造函数调用初始化,并且该对象是值初始化的,或者其初始化程序中出现的每个完整表达式都是常量表达式.
我省略了引用,因为它在我的情况下并不重要.我如何理解标准是有3种情况:
假设我有以下课程:
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 = {};
};
Run Code Online (Sandbox Code Playgroud)
据我所知,这个类对于常量初始化是完全有效的(每个元素都可以不断初始化).这是真的?
这个类需要constexpr构造函数吗?
C++ 11和C++ 98是否保证了常量初始化?
附带问题:如果是/ dll,静态初始化什么时候完成?在加载时间内,还是可能会进一步延迟?
最好知道这个问题背后的目的。还有您关心的是分配还是具体的初始化。
但是,初始化的类型并不重要,因为所需的空间是在编译时分配的。根据您定义变量的方式,它将最终出现在 .bss 或 .data 部分中。
初始化,正如你所知,只是为了在第一次使用内存之前确保内存中的特定内容。如果您没有定义分配动态内存的构造函数,那么将不会有任何动态分配(如果这是您关心的问题)。
对于简单的构造函数,我相信编译器将生成内联代码并使用相同的代码在编译时初始化对象(我不确定标准谈论了什么,但它可能依赖于工具链。) ,非局部静态对象将在图像加载到内存中时初始化,局部静态对象将在加载堆栈帧时初始化。在任何情况下,您应该在首次使用之前找到处于已知状态的对象。
| 归档时间: |
|
| 查看次数: |
1000 次 |
| 最近记录: |