单例与静态成员实例

时间:2016-03-12 13:11:55

标签: c++ performance design-patterns

我有一个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_是否已经初始化。

1 个答案:

答案 0 :(得分:3)

您的解决方案很容易static initialization order fiasco

静态类成员与所有全局静态变量一起初始化;在main()之前,以未指定的顺序。如果一个静态变量的初始化恰好引用另一个静态变量,则会得到未定义的行为。

然而,在函数中使用静态变量会给您特殊的保证:只有在第一次执行函数时才会创建对象。这意味着您不必担心初始化顺序(除非您创建一个循环,显然)。

关于性能,检查由编译器实现,因此它可能非常好地调整。一如往常,如果您有疑问 - 基准。