C++ 具有静态成员实例的Singleton
我有一个单例实现,我不确定它包含哪些缺点。谁能告诉我这个实现有多好C++ 具有静态成员实例的Singleton,c++,performance,design-patterns,C++,Performance,Design Patterns,我有一个单例实现,我不确定它包含哪些缺点。谁能告诉我这个实现有多好 template <class Child> class Singleton { public: inline static Child& Instance() { return Instance_; } Singleton(const Singleton&) = delete; Singleton(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_;
但是,这不需要额外的开销,因为每次调用函数时,它都必须检查实例是否已经初始化。您的解决方案很容易出错
静态类成员与所有全局静态变量一起初始化;在main()
之前,按未指定的顺序。若一个静态变量的初始化碰巧引用了另一个静态变量,则会得到未定义的行为
但是,在函数中使用静态变量可以为您提供特殊的保证:只有在第一次执行函数时才会创建对象。这意味着您不必担心初始化顺序(显然,除非您创建了一个循环)
关于性能,检查是由编译器实现的,所以它可能被调优得非常好。一如既往,如果您有疑问,请选择基准 这可能是一个很好的问题,因为只有在创建对象时才会有差异。在您的例子中,对象将在主函数之前构造,Meyers的技巧显示延迟构造。关于性能,这是你最不应该关心的部分。正如Meyers所说,除非profiler这样说,否则不要进行优化。
inline static Child& Instance() {
static Child Instance_;
return Instance_;
}