我有一个Singleton实现,我不确定它包含哪些缺点。有人能告诉我这个实现有多好吗?
template <class Child>
class Singleton {
public:
inline static Child& Instance() {
return Instance_;
}
Singleton(const Singleton&) = delete;
Singleton(Singleton&&) = delete;
Singleton& operator=(const Singleton&) = delete;
Singleton& operator=(Singleton&&) = delete;
protected:
Singleton() = default;
private:
static Child Instance_;
};
template <typename Child> Child Singleton<Child>::Instance_;
我知道Scott Meyers的Singleton实现定义了Instance_
函数中的静态GetInstance()
。
inline static Child& Instance() {
static Child Instance_;
return Instance_;
}
但是不存在额外的开销,因为每次调用函数时都必须检查Instance_
是否已经初始化。
答案 0 :(得分:3)
您的解决方案很容易static initialization order fiasco。
静态类成员与所有全局静态变量一起初始化;在main()
之前,以未指定的顺序。如果一个静态变量的初始化恰好引用另一个静态变量,则会得到未定义的行为。
然而,在函数中使用静态变量会给您特殊的保证:只有在第一次执行函数时才会创建对象。这意味着您不必担心初始化顺序(除非您创建一个循环,显然)。
关于性能,检查由编译器实现,因此它可能非常好地调整。一如往常,如果您有疑问 - 基准。