非局部变量(non-local variable)的生命期(lifetime/lifecycle)是C++语言的一个阴暗角落,隐藏着很多细节问题。由于C++11新加了线程支持,非局部变量从存储特性上分为static storage duration和thread storage duration两类。SSD对象的初始化和终止化伴随程序初始化和终止发生,TSD对象的初始化和终止化伴随线程的执行和退出发生(程序或线程的初始化/终止化是因,变量的初始化/终止化是果)。
非局部变量的初始化分为静态初始化和动态初始化两个阶段。其中静态初始化包括零初始化和可能的常量初始化(C++11引入了常量表达式,扩大了常量初始化的范畴)。所谓动态初始化是指除了零初始化和常量初始化之外的任何初始化。一般而言动态初始化需要运行期进行计算。
所有非局部变量都有零初始化过程。而是否有常量初始化和动态初始化则视非局部变量的初始化器而定。C++语言保证静态初始化一定在动态初始化开始之前完成,而且零初始化一定在任何其它初始化之前完成。这一保证是对所有非局部变量而言,即所有零初始化都完成之后才会对需要常量初始化的对象执行常量初始化,然后再对需要动态初始化的对象执行动态初始化。由于用户代码获得控制权要么是通过main函数要么是通过动态初始化,不论如何,用户代码得以运行时静态初始化都已完成。static int kZero; // zero-initialization
static int kOne = 1; // zero-initialization, constant initialization
static int* kVar = new int(2); // zero-initialization, dynamic initializati