小编Mas*_*ari的帖子

C++单例类实例的堆/动态与静态内存分配

我的具体问题是,在C++中实现单例类时,以下两个代码之间在性能,方面问题或其他方面存在实质性差异:

class singleton
{
    // ...
    static singleton& getInstance()
    {
        // allocating on heap
        static singleton* pInstance = new singleton();
        return *pInstance;
    }
    // ...
};
Run Code Online (Sandbox Code Playgroud)

还有这个:

class singleton
{
    // ...
    static singleton& getInstance()
    {
        // using static variable
        static singleton instance;
        return instance;
    }
    // ...
};
Run Code Online (Sandbox Code Playgroud)


(请注意,基于堆的实现中的解除引用不应该影响性能,因为AFAIK没有为解除引用生成额外的机器代码.似乎只需要语法来区分指针.)

更新:

我有一些有趣的答案和评论,我试着在这里总结一下.(建议有兴趣的人阅读详细的答案.):

  • 在使用静态局部变量的单例中,类析构函数在进程终止时自动调用,而在动态分配情况下,您必须在某个时候管理对象破坏,例如通过使用智能指针:
    static singleton& getInstance() {
        static std::auto_ptr<singleton> instance (new singleton());
        return *instance.get(); 
    }
Run Code Online (Sandbox Code Playgroud)
  • 使用动态分配的单例比静态单例变量"更懒惰",如后一种情况,单例对象所需的内存(始终?)在进程启动时保留(作为加载程序所需的整个内存的一部分)并且只调用单例构造函数被推迟到getInstance()调用时.这可能sizeof(singleton)很重要.

  • 两者都是C++ 11中的线程安全的.但是对于早期版本的C++,它是特定于实现的. …

c++ memory singleton static dynamic-memory-allocation

16
推荐指数
1
解决办法
9094
查看次数