关于静态初始化顺序 Fiasco 的问题

Question regarding Static Initialization Order Fiasco

我目前正在阅读旧版本的 Nicolai Josuttis 关于 C++ 模板的书。我的问题是关于 SortTracer 的静态数据成员的初始化,如实施 here.

具体来说,在 tracer.hpp 中,我们有:

class SortTracer {
  private:
    int value;                // integer value to be sorted
    int generation;           // generation of this tracer
    static long n_created;    // number of constructor calls
    static long n_destroyed;  // number of destructor calls
    static long n_assigned;   // number of assignments
    static long n_compared;   // number of comparisons
    static long n_max_live;   // maximum of existing objects
    ...
}

以上静态数据成员的初始化都在tracer.cpp:

#include "tracer.hpp"

long SortTracer::n_created = 0;
long SortTracer::n_destroyed = 0;
long SortTracer::n_max_live = 0;
long SortTracer::n_assigned = 0;
long SortTracer::n_compared = 0;

测试代码为here:

#include "tracer.hpp"
...

int main()
{
    // prepare sample input:
    SortTracer input[] = { 7, 3, 5, 6, 4, 2, 0, 1, 9, 8 };
    ...
}

我的问题/困惑是:这个程序不会受到 static initialization order fiasco 的影响吗? (这意味着,即使目前程序产生正确的结果,也是由于tracer.cpp中静态数据成员的初始化与默认初始化相同)

所有全局变量(包括class级静态变量)保证在main()之前初始化。它们在不同源文件之间的初始化顺序未定义。

Global Initialization Order Fiasco是指一个文件中的全局变量被另一个源文件中的全局变量初始化的情况,其结果取决于初始化顺序。在你的例子中,变量初始化为零,所以没有“惨败”——程序是安全的。