繁体   English   中英

单例延迟初始化的问题

[英]Problems with lazy initialization of singleton

我想制作具有如下行为的单例类。

  1. 我的程序资源非常有限,所以我不想在需要之前制作单例实例。 (延迟初始化)
  2. 单例类非常庞大,因此初始化需要很长时间。
  3. 响应时间在这个程序中很重要。(如游戏)

但如你所知,1 & 2 & 3 是相互冲突的。 在这种情况下,我必须选择其中之一(内存或性能)

该程序是否有任何解决方案可以满足内存和性能要求?

“该程序是否有任何解决方案可以满足内存和性能要求?”

无论如何都需要满足这些要求。 为了确保单例类的延迟实例化,我建议使用 scott meyer 的单例实现来保证这里提到的延迟/线程安全初始化:

class Singleton {
public:
     static Singleton& Instance() {
          static Singleton theInstance;
          return theInstance;
     }
     delete Singleton(const Singleton&);
     delete Singleton& operator=(const Singleton&);
private:
     Singleton() {}

};

关于内存消耗,您必须以不同的方式对其进行优化。 我实际上无法判断,您可能在哪里有可能缩小您的内存占用。 到目前为止,您的问题没有提供足够的信息。


“但如你所知,1&2&3是相互冲突的。在这种情况下,我必须选择其中之一(内存或性能)”

我看不到任何实际冲突? 第一次访问Singleton::Instance可能会影响性能,但后续访问不会触发初始化,那又怎样?

很难说,因为你没有提供很多细节。你的资源在内存和磁盘上是否有限? 单例类需要时间来初始化是因为它很大,还是因为它必须做很多计算? 长时间是多少? 多大是巨大的? 什么是有限资源?

如果您有磁盘空间并且读/写磁盘相对较快,并且如果您可以在程序初始化期间花费一些时间,则可以在启动时创建并将您的类序列化到磁盘(并保持文件锁定),并且如果内存不足,则在需要时从那里读取您的实例。 或者在另一个线程中创建单例并在主线程中做一些其他的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM