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_;
}