gpt4 book ai didi

c++ - 实现像 ios_base::Init 这样的初始化器的标准方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:59:50 25 4
gpt4 key购买 nike

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

我想实现一个行为与 ios_base::Init 相同的初始化器,即我想保证我的一些全局对象在我包含一些 header 后立即初始化,然后再用于另一个全局变量的构造函数。但是,这需要使用原子操作。 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的初始化器之前构造一个全局原子变量。要初始化它,我需要另一个初始化器来初始化它,依此类推,不幸的是,要进行一些无限递归。

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

最佳答案

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

就是说,如果您的程序在 main 之前没有启动任何线程开始,您可能不必为此担心太多。

顺便说一句,您描述的结构也称为 nifty counter或 Schwarz 计数器。

关于c++ - 实现像 ios_base::Init 这样的初始化器的标准方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10521263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com