具有静态成员实例的单例

Phi*_*tor 2 c++ performance design-patterns

我有一个单例实现,但我不确定它包含哪些缺点。有人能告诉我这个实施有多好吗?

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_;
Run Code Online (Sandbox Code Playgroud)

我知道 Scott Meyers 的 Singleton 实现定义了函数Instance_内部的静态GetInstance()。

inline static Child& Instance() {   
    static Child Instance_;
    return Instance_;
}
Run Code Online (Sandbox Code Playgroud)

但这是否会带来额外的开销,因为每次调用该函数时都必须检查该函数是否Instance_已初始化。

rbu*_*rny 8

您的解决方案很容易出现静态初始化顺序惨败。

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

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

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