单例延迟初始化的问题
Problems with lazy initialization of singleton
我想制作具有如下行为的单例 class。
- 我的程序资源非常有限,所以除非我需要,否则我不想创建单例实例。 (延迟初始化)
- Singleton class 非常庞大,所以初始化需要很长时间。
- 响应时间在此程序中很重要。(如游戏)
但是如您所知,1 & 2 & 3 是相互冲突的。
在这种情况下,我必须选择其中之一(内存或性能)
程序是否有任何解决方案可以满足内存和性能要求?
"Is there any solutions the program can meet memory & performance requirement?"
无论如何都需要满足这些要求。为了确保 单例 class 的惰性实例化 ,我建议使用 scott meyer 的单例实现来保证 lazy/thread 安全初始化,如前所述 :
class Singleton {
public:
static Singleton& Instance() {
static Singleton theInstance;
return theInstance;
}
delete Singleton(const Singleton&);
delete Singleton& operator=(const Singleton&);
private:
Singleton() {}
};
关于内存消耗,您必须以不同的方式对其进行优化。我实际上无法判断,您可能在哪里缩小内存占用空间。到目前为止,您的问题没有提供足够的信息。
"But as you know, 1 & 2 & 3 is conflict with each other. In this conditions, I have to choose one of them (memory or performance)"
我看不到任何实际冲突??第一次访问 Singleton::Instance
时可能会影响性能,但后续访问不会触发初始化,那又怎样?
很难说,因为您没有提供很多 details.Are 您的资源在内存和磁盘方面有限吗?单例 class 需要时间来初始化是因为它很大,还是因为它需要做很多计算?长时间是多少?巨大的是多少?什么是有限资源?
如果你有磁盘 space 并且 reading/writing 磁盘比较快,
如果您可以在程序初始化期间花一些时间,
您也许可以创建 class 并将其序列化到磁盘(并保留文件
locked) 启动时,然后在内存不足的情况下在需要时从那里读取您的实例。或者在另一个线程中创建单例并在主线程中做一些其他事情。
我想制作具有如下行为的单例 class。
- 我的程序资源非常有限,所以除非我需要,否则我不想创建单例实例。 (延迟初始化)
- Singleton class 非常庞大,所以初始化需要很长时间。
- 响应时间在此程序中很重要。(如游戏)
但是如您所知,1 & 2 & 3 是相互冲突的。 在这种情况下,我必须选择其中之一(内存或性能)
程序是否有任何解决方案可以满足内存和性能要求?
"Is there any solutions the program can meet memory & performance requirement?"
无论如何都需要满足这些要求。为了确保 单例 class 的惰性实例化 ,我建议使用 scott meyer 的单例实现来保证 lazy/thread 安全初始化,如前所述
class Singleton {
public:
static Singleton& Instance() {
static Singleton theInstance;
return theInstance;
}
delete Singleton(const Singleton&);
delete Singleton& operator=(const Singleton&);
private:
Singleton() {}
};
关于内存消耗,您必须以不同的方式对其进行优化。我实际上无法判断,您可能在哪里缩小内存占用空间。到目前为止,您的问题没有提供足够的信息。
"But as you know, 1 & 2 & 3 is conflict with each other. In this conditions, I have to choose one of them (memory or performance)"
我看不到任何实际冲突??第一次访问 Singleton::Instance
时可能会影响性能,但后续访问不会触发初始化,那又怎样?
很难说,因为您没有提供很多 details.Are 您的资源在内存和磁盘方面有限吗?单例 class 需要时间来初始化是因为它很大,还是因为它需要做很多计算?长时间是多少?巨大的是多少?什么是有限资源?
如果你有磁盘 space 并且 reading/writing 磁盘比较快, 如果您可以在程序初始化期间花一些时间, 您也许可以创建 class 并将其序列化到磁盘(并保留文件 locked) 启动时,然后在内存不足的情况下在需要时从那里读取您的实例。或者在另一个线程中创建单例并在主线程中做一些其他事情。