实现初始值设定项的标准方法,如 ios_base::Init

Standard way to implement initializer like ios_base::Init

本文关键字:ios base Init 方法 标准 实现      更新时间:2023-10-16

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

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

根据如何有效地使用 std::atomic

,std::atomic 是进行原子操作的唯一标准方法,所以我需要在 TU 中的初始值设定项之前构造一个全局原子变量。 要初始化它,我需要另一个初始化它的初始值设定项,依此类推,可悲的是,去一些无限递归。

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

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

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

顺便说一下,您描述的结构也称为漂亮的计数器或施瓦茨计数器。