Start-Up

程序被第一次调用到控制线程进入main之间的这段时间称为启动(start-up)。也就是在这段时间里,每一个编译单元中所有的非局部静态对象都会被构造。

Start-Up

定义在编译单元内的非局部静态变量的初始化顺序是依赖于编译器实现的,应该注意在使用这种对象前是否已经初始化。当我们想要提供一个全局可访问的单一实例对象时,对全局数据的厌恶引导我们寻找替代方案。我们可以使用一个称为module的逻辑结构,这中逻辑结构在C++中可以用只包含静态成员的类来实现,而不是创建带有外部链接(external linkage)的文件范围内的一个实例对象。

在以下情况下优先使用module而不是非局部静态实例对象:

  1. 需要在编译单元之外访问construct。
  2. 在启动或刚启动之后不需要construct,并且初始化construct本身的时间是显著的。

我们已经知道静态结构使用前必须初始化。还有一点也需要注意,这种初始化会影响启动的时间。对小程序来说,启动时初始化少量的静态结构所使用的时间对用户来说几乎感知不到。然而,系统越大,静态结构越多这种影响就会越显著。

每一个非局部静态对象的构造都会潜在地增加启动时间。

有文献记载,有的超大型系统,由于忽视了这个问题,导致启动时间超过了10分钟!

非局部静态对象由C++运行时系统自动初始化和析构。滥用非局部静态对象会降低集成系统的启动性能。虽然我们没办法阻止这些静态对象在启动时被初始化,但对于怎样和何时初始化模块却有相当大的灵活性。我们可以把一个单一的全局实例对象转化成一个模块,初始化时,动态分配那个对象。一旦初始化,模块就能成功返回这个动态对象的引用。