我最近发现了 Nifty Counter Idiom。我的理解是它用于在标准库中实现全局变量,例如 cout、cerr 等等。由于专家们选择了它,我认为这是一种非常强大的技术。
我想了解它与使用 Meyer Singleton 等类似东西相比的优势。
例如,可以在头文件中直接写:
inline Stream& getStream() { static Stream s; return s; }
static Stream& stream = getStream();
优点是您不必担心引用计数、放置新对象或拥有两个类,即代码更加简单。既然不是这样做的,我相信这其中一定有原因:
- 无法保证在共享和静态库中具有单个全局对象吗?似乎ODR应该保证只能有一个静态变量。
- 是否存在某种性能成本?在我的代码和Nifty Counter中,似乎都是通过跟随一个引用来访问对象。
- 是否存在某些情况下引用计数实际上是有用的?似乎它仍然会导致对象在包含头文件时被构造,并在程序结束时被销毁,就像Meyer Singleton一样。
- 答案是否涉及手动dlopen打开某些东西?我对此没有太多经验。
编辑:在阅读Yakk的答案时,我被提示编写了以下代码片段,并将其添加到原始问题中作为一个快速演示。这是一个非常简单的示例,演示了如何使用Meyer Singleton + 全局引用在main之前初始化: http://coliru.stacked-crooked.com/a/a7f0c8f33ba42b7f。
static Stream s;
吗? - Barry