singleton的延迟初始化问题

Problems with lazy initialization of singleton

本文关键字:问题 初始化 延迟 singleton      更新时间:2023-10-16

我想创建具有如下行为的singleton类。

  1. 我的程序资源非常有限,所以在需要之前我不想创建singleton实例。(惰性初始化)
  2. Singleton类非常庞大,因此初始化需要很长时间
  3. 响应时间在这个程序中很重要。(喜欢游戏)

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

该程序有什么解决方案可以满足内存&性能要求?

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

无论如何,都需要满足这些要求。为了确保singleton类的惰性实例化,我建议使用scott-meyer的singleton实现来保证惰性/线程安全初始化,如下所述:

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时可能会对性能造成影响,但随后的访问不会触发初始化,那又怎样呢?

很难说,因为您没有给出太多细节。您的内存和磁盘资源是否有限?singleton类初始化需要时间,是因为它很大,还是因为它必须进行多次计算?多长时间多少钱?多少是巨大的?什么是有限的资源?

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