C++ 单例延迟初始化实现和链接似乎冲突

Fac*_*Bro 1 c++ singleton linkage

C++ 单例设计模式我遇到这个问题并了解到在 C++ 中有两种实现单例模式的方法。

1)在堆中分配单个实例并在instance()调用中返回它

2)在instance()调用中返回一个静态实例,这也称为延迟初始化实现。

但我认为第二个,即延迟初始化实现,是错误的,原因如下。从instance()调用返回的静态对象具有内部链接,并且在不同的翻译单元中具有唯一的副本。因此,如果用户修改单例,它不会反映在任何其他翻译单元中。

但有很多说法表明第二种实现是正确的,我是否遗漏了什么?

Hor*_*ing 5

在方法的上下文中,static关键字与链接无关。它只影响所定义变量的“存储类别”。对于静态局部变量,标准明确指出:

9.3.6 成员函数中的静态局部变量始终引用同一个对象,无论成员函数是否内联。

因此,将代码放在头文件还是 cpp 文件中根本不重要。

请注意,对于自由/非成员函数,它确实依赖于函数的链接,正如 KerrekSB 指出的那样。

  • 这可能有点误导。如果标头中有一个自由函数,`static int foo() { static int n; 返回++n;}`,那么包含该标头的每个翻译单元都有其自己的单独计数器。类成员函数有些不同。 (2认同)