关于Boost Singleton do_nothing()的那点事

关于C++ boost singleton模式中的do_nothing()

关于这个do_nothing()函数是最令人迷惑的,按照一般思维,静态变量在程序main()开始之前就已经存在,那为什么需要加上一个do_nothing()

原来我们漏掉了这个 C++ 标准3.6.2 initialisation of non local variables.

It is implementation-defined whether the dynamic initialization of a non-local variable with static storage

duration is done before the first statement of main…

global对象,定义在namespace内的对象,class内的static对象,函数内的static对象,file作用域内的 static对象)统称为static对象。其中函数内的static对象又叫local static object, 其他的叫non-local static object

non-local static object的初始化顺序是没有定义的,local static object在函数第一次调用时构造初始化。

还有:non-local static object会在main函数之前被初始化。

boostsingleton的实现基于以下假设:良好的设计在进入main函数之前应该是单线程的

我们可以使用全局变量的方式来设计singleton,并且保证在使用该singleton之前其已经被正确的初始化。

在进入main之前,唯一的主线程开始构造Singleton<T>::create_object,在其构造函数之内调用 Singletoninstance函数,并在该函数内生成Singleton对象,至于函数do_noting(),去掉之后照样可以通过编译,我想原 因可能是为了再次保证singleton的初始化完全成功。

通俗的讲,模版具有延迟实现机制,只是声明create_object而不调用create_object的方法是不会真正实例化的,所以有了create_object.do_nothing(),确保create_object被实例化。