我知道有关静态变量何时初始化的基本保证。最重要的是(对我来说)不能保证的是不同编译单元中变量的初始化顺序,这引发了以下问题。
我总是写这样的单身人士课程:
class A {
...
public:
static std::shared_ptr<A> getInstance();
private:
static std::shared_ptr<A> _instance;
}
== A.cpp ==
std::shared_ptr<A> A::getInstance() {
if(!_instance)
_instance = std::make_shared<A>();
return _instance;
}
但据我所知,这并不保证实例已经初始化(因此调用操作符bool是有效的)如果我在任何其他静态Object的构造函数中调用此函数(在某些罕见的情况下可能会在main之前发生)开始执行。)
我的新想法如下:
class A {
...
public:
static std::shared_ptr<A> getInstance();
}
== A.cpp ==
A& A::getInstance() {
static std::shared_ptr<A> _instance = std::make_shared<A>();
return _instance;
}
在我看来,这不仅仅是更干净,而且更好的代码,因为现在我有一个保证的初始化顺序。
我的假设是否正确?
答案 0 :(得分:0)
实际上_instance
保证在第一次调用getInstance()
之前初始化(假设它们是在同一个翻译单元中定义的)
来自标准 3.6.2-4非本地变量的初始化 :
实现定义是否使用静态存储动态初始化非局部变量 持续时间在主要的第一个陈述之前完成。如果初始化延迟到某个时间点 在第一个main语句之后,它应该在任何函数或变量的第一次使用(3.2)之前发生 在与要初始化的变量相同的翻译单元中定义.35