getInstance()如何工作?

时间:2013-09-25 05:54:31

标签: c++ oop static

最近我在getInstance()方法中广泛使用了一些C ++代码:

class S
{
    private:
        int some_int = 0;
    public:
        static S& getInstance()
        {
            static S instance; / (*) /
            return instance;
        }
};

从这个代码片段的使用方式来看,我学习了getInstance()就像return this一样工作,返回class S实例的地址(或ref)。但我感到困惑。

1)在内存中分配的行(*)中定义的静态变量S在哪里?为什么它可以像return this一样工作?

2)如果存在多个class S实例,其引用将被返回怎么办?

2 个答案:

答案 0 :(得分:5)

这就是所谓的Singleton design pattern。它的显着特点是,只能存在该类的一个实例,并且模式可以确保该类。该类具有私有构造函数和使用getInstance方法返回的静态创建的实例。您无法从外部创建实例,因此只能通过所述方法获取对象。

由于instance方法中staticgetInstance,因此它将在多次调用之间保留其值。它在第一次使用之前被分配和构建。例如。在this answer中,似乎GCC在首次使用该函数时初始化静态变量。 This answer有一些与C ++标准相关的摘录。

答案 1 :(得分:2)

第一次调用函数时会分配带有函数作用域的静态变量。编译器会跟踪第一次初始化的事实,并避免在下次访问函数期间进一步创建。这个属性非常适合实现singleton pattern,因为这可以确保我们只维护一个对象副本。此外,较新的编译器确保此分配也是线程安全的,在不使用任何动态内存分配的情况下提供额外的线程安全单例实现。 [正如评论中指出的那样,它是c ++ 11标准,它保证了线程的安全性,所以如果你使用不同的编译器,请检查线程安全性]

  

1)在()中分配的静态变量S在哪里分配   记忆?为什么它可以像回归那样工作?

内存中存在静态变量的特定区域,例如动态分配变量的堆和典型编译时定义变量的堆栈。它可能因编译器而异,但对于GCC,编译器在executable generated中存在称为DATA和BSS段的特定部分,其中存储了初始化和未初始化的静态变量。

  

2)如果存在多个S类实例,那么该怎么办?   参考将被退回?

如上所述,由于它是一个静态变量,编译器确保在第一次访问函数时只能创建一个实例。此外,因为它在函数中具有范围,所以它不能与其他任何其他实例冲突,而getInstance确保您看到相同的单个实例。