C++ 单例惰性初始化实现和链接似乎有冲突

标签 c++ singleton linkage

C++ Singleton design pattern我遇到了这个问题,了解到有两种方法可以在 C++ 中实现单例模式。

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

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

但我认为第二种,即惰性初始化实现,由于以下原因是错误的。 从 instance() 调用返回的静态对象具有内部链接,并且在不同的翻译单元中将具有唯一的拷贝。因此,如果用户修改单例,它不会反射(reflect)在任何其他翻译单元中。

但是有很多说法说第二种实现是正确的,我是不是漏掉了什么?

最佳答案

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

9.3.6 A static local variable in a member function always refers to the same object, whether or not the member function is inline.

因此,将代码放在头文件还是 cpp 文件中根本无关紧要。

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

关于C++ 单例惰性初始化实现和链接似乎有冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42457227/

相关文章:

c# - 如何在 C# 中返回静态类实例

singleton - WebLogic集群单例服务

c++ - OpenGL 试图渲染 2 个纹理,但只有 1 个可以?

c++ - Intel HD 3000 上正确的 OpenGL 初始化是什么?

C++ 单例尝试 : unresolved external symbol

c++ - gtest 和 MinGW 联动

c - 为什么结构定义有内部链接?

c++ - 为什么 extern “C” 在这里分组 C++ 类(不是标题)?

javascript - C++、Qt、QtWebKit : How to create an html rendering window so that your application would get callbacks from JS calls?

c++ - 字符串比较返回值(用于对字符进行排序的应用程序吗?)