初始化
在构造一个变量的时候,提供一个最初的值就叫初始化
Non-local variables
所有的具有static存储时长non-local variables被初始化,是作为在程序开始的一部分工作,在main()函数开始之前(下面的deferred 是例外)。所有具有thread-local存储时长的non-local variables在线程函数开始之前初始化。
这两类变量初始化分为两个不同阶段:
Static initialization
有两种形式的静态初始化
1)constant initialization
2)zero-initalized
#include<iostream>
using namespace std;
int x=100;
int y;
int main()
{
std::cout<<x<<std::endl;
std::cout<<y<<std::endl;
}
x是constant initialization,在编译时就已经确定了,并且会作为程序image的一部分,保存在可执行文件中。
y是zero initialization,会被放置在.程序image 的.bss段,不会占据磁盘空间,而是在os加载程序的时候把它们zero
dynamic initialization
在所有static 初始化完成后,non-local variables 的动态初始化会发生在羡慕三种情况
1)unordered dynamic 初始化,仅仅在没有显示具体化的类模板静态数据成员和可变模板
2)partially-ordered dynamic 初始化(c++17)
3)ordered dynamic 初始化,在一个翻译单元内的non-local variables 变量初始化总是有序的,跟它们在源代码文件中的定义的顺序一致。
1,2我们就暂时不去了解主要看看3)
#include <iostream>
class Value {
public:
Value(int x) : v(x) { std::cout << "Value(" << v << ")\n"; }
~Value() noexcept { std::cout << "~Value(" << v << ")\n"; }
int v {0};
static Value*pv;
};
Value* Value::pv=new Value(996);
double z = 100.0;
int x;
Value v{42};
int main() {
puts("main starts...");
std::cout << x << '\n';
std::cout<<Value::pv->v<<'\n';
puts("main ends...");
}
在同一个单元我们可以看见动态初始化的顺序在同一个单元文件中都是按定义顺序的并且在main函数之前。