实现初始化程序的标准方法,如ios_base :: Init

时间:2012-05-09 17:41:07

标签: c++ c++11

在libstdc ++中,<iostream>标题定义 ios_base::Init的实例,其构造函数原子地增加计数器并在计数器为0时初始化cin / cout / cerr。这保证cin / cout / cerr总是在#include <iostream>后的每个TU中初始化。

我想实现一个与ios_base::Init具有相同行为的初始化程序,即我想保证在我将另一个全局变量的构造函数用于其中之前,只要包含一些标题,我的一些全局对象就会被初始化。但是,这需要使用原子操作。 libstdc ++使用GCC的扩展,这不是标准的:http://gcc.gnu.org/viewcvs/trunk/libstdc%2B%2B-v3/src/c%2B%2B98/ios_init.cc?view=markup

根据How to use std::atomic efficiently,std :: atomic是进行原子操作的唯一标准方式,所以我需要在所有TU中的初始化器之前构造一个全局原子变量。要初始化它,我需要另一个初始化它来初始化它,依此类推,遗憾的是,去一些无限递归。

所以我的问题是,最好的标准方法是什么?

1 个答案:

答案 0 :(得分:0)

标准原子变量具有常量表达式构造函数,这意味着它们在静态初始化阶段(即在编译时)初始化。因此,使用std::atomic<int>之类的东西作为你的计数器是没有问题的。

也就是说,如果您的程序在main启动之前没有启动任何线程,那么您可能不必过于担心这一点。

顺便提一下,您描述的构造也称为nifty counter或Schwarz计数器。