静态变量初始化为 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 函数之前。
如果该单例依赖于其他单例等,这将导致问题
也就是说,第一个版本会让您更好地控制您的代码、初始化顺序,当然还有更少的错误 :)
我将使用单例模式演示我的问题,但这是一个更广泛的问题。请给我 "Singletons are evil" 个讲座。
Singleton
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
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 函数之前。
如果该单例依赖于其他单例等,这将导致问题
也就是说,第一个版本会让您更好地控制您的代码、初始化顺序,当然还有更少的错误 :)