单例模式性能问题

rem*_*ada 2 c++ singleton

我正在审查一段使用大量单例类和访问的现有代码.我正在尝试提高此代码的性能.

想到的一件事是优化Singleton :: getInstance()代码片段.

而不是使用Singleton :: getInstance(),我倾向于用两个调用的结构替换它.

一个.一个可以创建和准备单例实例的函数,如Singleton :: prepareInstance(),它将在子系统的开头被调用一次.湾 getInstance()的内联实现,只返回引用而不检查它是否有效.

这是可行的解决方案吗?有什么方法可以改进吗?

我当前的Singleton :: getInstance()代码看起来像这样

Singleton * Singleton::getInstance() {
    if(m_instance == NULL) {
        m_instance = new Singleton();
    }
    return m_instance;
}
Run Code Online (Sandbox Code Playgroud)

πάνταῥεῖ提到的方法是否更快?

Lea*_*yes 6

正确实施不Singleton::getInstance()应该有任何性能问题.当然第一次调用可能代价很高(对于单例实例的初始设置),但任何后续调用应该只返回应该超快的实例.

湾 getInstance()的内联实现,只返回引用而不检查它是否有效.

在我看来,这违背了单身人士模式的一个基本概念.Singleton::getInstance()应该总是返回一个有效的实例.


πάν*_*ῥεῖ 6

湾 getInstance()的内联实现,只返回引用而不检查它是否有效.

为什么需要检查有效性?我的单例GetInstance()实现通常如下所示:

Singleton& Singleton::instance() {
    static Singleton theInstance;
    return theInstance;
}
Run Code Online (Sandbox Code Playgroud)

我怀疑这些代码是否会对性能产生任何影响,也没有必要检查任何有效性.

  • 在C++ 11中(至少使用Clang和g ++,不确定VC++),此代码将发出一个检查,以查看实例是否已初始化(如果初始化不是微不足道),以确保线程安全.它仍然不是性能问题,但这基本上等同于问题中的空指针检查. (5认同)