2015-07-02 32 views
-2

我想做单身人士的行为如下。单身人士的懒惰初始化问题

  1. 我的程序资源非常有限,所以我不想让singleton实例直到我需要它。 (延迟初始化)
  2. 单例类非常大,所以初始化需要很长时间。
  3. 响应时间是在这个方案非常重要。(如游戏)

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

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

+0

最直接的答案似乎是:_不要使用SINGLETONS_(除非你100%确定你在做什么)。 –

+0

在程序执行过程中,您是否需要单例程序,或者程序可能不需要它用于给定的运行?如果它是前者,那么你最好在开始时初始化它,因为内存和CPU在某个时候会很受欢迎,所以我认为隐藏它的最佳位置是在启动时,而不是执行该程序的一半。 – Sam

回答

0

“有没有解决方案可以满足内存&性能要求?”

无论如何需要满足这些要求。为了确保单个类的延迟实例,如前所述here我会建议使用斯科特·迈尔的单执行,以保证懒/线程安全初始化:

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

}; 

关于内存消耗,你必须优化它以不同的方式。我实际上不知道,你可能有潜力缩小你的内存占用。到目前为止您的问题没有足够的信息。


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

我看不到任何实际的冲突?在第一次访问Singleton::Instance时可能会出现性能问题,但随后的访问不会触发初始化,那又如何?

-2

这很难说,因为你没有给出很多details.Are你的资源有限的内存和磁盘?单例类需要时间来初始化,因为它很大,或者因为它需要做很多计算?很久很久了?多少是巨大的?什么是有限的资源?

如果你的磁盘空间,如果读/写盘是比较快的, ,如果你可以在你的程序中, 的初始化过程中花一些时间也许你可以创建并序列类到磁盘(并保持文件 锁定),然后在需要时从内部读取实例,如果内存不足的话。或者在另一个线程中创建单例,并在主线程中执行一些其他的东西。

+0

这并没有真正回答这个问题。请阅读_Singleton_,如果你甚至在这里尝试回答这样的问题。 –

+0

有没有解决方案可以满足内存和性能要求的程序? –

+0

有很多选项,实际上是正交处理的,与单独使用无关。 –