单例

时间:2015-07-02 00:06:19

标签: c++ singleton

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

  1. 我的程序资源非常有限,所以在我需要它之前我不想制作单例实例。 (懒惰的初始化)
  2. Singleton类非常庞大,因此初始化需要很长时间。
  3. 响应时间在此计划中非常重要。(如游戏)
  4. 但是如你所知,1& 2& 3是相互冲突的。 在这种情况下,我必须选择其中一个(记忆或表现)

    程序可以满足内存和解决方案吗?性能要求?

2 个答案:

答案 0 :(得分:0)

  

"程序可以满足内存和解决方案吗?性能要求?"

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

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时可能会出现性能损失,但后续访问不会触发初始化,那又是什么?

答案 1 :(得分:-2)

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

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