在调用main之前,boost中的singleton如何实现所有单例?

时间:2011-12-13 11:06:40

标签: c++ boost singleton

boost的单例源代码是there,我不明白下面源文件中的两个符号:

// ***include this to provoke instantiation at pre-execution time***
static void use(T const &) {};

BOOST_DLLEXPORT static T & get_instance() {
static detail::singleton_wrapper< T > t;
***// refer to instance, causing it to be instantiated (and
// initialized at startup on working compilers)***
BOOST_ASSERT(! detail::singleton_wrapper< T >::m_is_destroyed);
use(instance);
return static_cast<T &>(t);
}

问题是:这段代码如何在main()之前强制在c ++中初始化singleton?这两个符号是什么意思?

3 个答案:

答案 0 :(得分:2)

它不能。就是这条线:

template<class T>
BOOST_DLLEXPORT T & singleton< T >::instance = singleton< T >::get_instance();

它创建一个静态对象,通过调用get_instance进行初始化。因为它是一个类静态对象,所以它在main之前初始化。

答案 1 :(得分:1)

我认为第一条评论实际上是指上面的一行,

BOOST_DLLEXPORT static T & instance;

构建static T个实例。在main启动之前初始化静态,这只是一个C ++规则。

答案 2 :(得分:1)

您只是展示部分代码,这可以解释为什么您不理解。

在程序执行之前,必须先将其加载到内存中。那时,如果找到静态或全局范围变量,则使用指定的值或默认编译器初始化它。

然后,如果你指定一个类的静态实例,它的构造函数甚至会在main之前被调用! 这就是提升用于提供此功能的内容。