静态变量初始化为 class 成员或局部函数变量(单例示例)

Static variable initialization as a class member or local function variable (Singleton example)

我将使用单例模式演示我的问题,但这是一个更广泛的问题。请给我 "Singletons are evil" 个讲座。

Singleton

的第 1 版
class Singleton
{
  public:
    static Singleton& getInstance()
    {
      static Singleton instance; // This becomes a class member in Ver.2
      return instance;
    }

  private:
    // Constructor, forbid copy and assign operations etc...
}

Singleton

的第 2 版
class Singleton
{
  public:
    static Singleton& getInstance()
    {
      return instance;
    }

  private:
    static Singleton instance; // I'm here now!

    // Constructor, forbid copy and assign operations etc...
}

我现在将解释我认为两者之间的区别:

版本 1 instance 只有在程序流达到 instance 的实际定义时才会被初始化(即程序的某些部分使用 Singleton::getInstace() 请求实例)。换句话说,惰性实例化。 它只会在程序终止时被销毁。

版本 2 instance 将在程序开始时初始化,在调用 main() 之前。也只会在程序终止时销毁。

首先,我上面的假设是否正确?
其次,这种初始化行为是否通用(比如全局变量和函数)?
最后,关于这方面还有其他细微差别我应该注意吗?

谢谢!

你是对的。

您还应该注意到,第二个版本不保证对象何时被创建,只保证它会在调用 main 函数之前。

如果该单例依赖于其他单例等,这将导致问题

也就是说,第一个版本会让您更好地控制您的代码、初始化顺序,当然还有更少的错误 :)