实现初始值设定项的标准方法,如 ios_base::Init
Standard way to implement initializer like ios_base::Init
在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 是进行原子操作的唯一标准方法,所以我需要在 TU 中的初始值设定项之前构造一个全局原子变量。 要初始化它,我需要另一个初始化它的初始值设定项,依此类推,可悲的是,去一些无限递归。
所以我的问题是,最好的标准方法是什么?
标准原子变量具有常量表达式构造函数,这意味着它们在静态初始化阶段(即在编译时(进行初始化。因此,使用std::atomic<int>
之类的东西作为计数器没有问题。
也就是说,如果您的程序在启动之前没有启动任何线程main
那么无论如何您都不必太担心这一点。
顺便说一下,您描述的结构也称为漂亮的计数器或施瓦茨计数器。
相关文章:
- 使用ios:ate写入到流会覆盖现有文件
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 构造函数采用 Base&不被调用
- 如何访问RTCVideoRenderer的帧?(ios)
- ios::fmtflags 在 C++ 中是如何工作的?setf() 是如何工作的?
- 将sharet_ptr<Derived>转换为shared_ptr<Base>
- 将 BASE 派生类存储在同一容器中
- 避免矢量中的对象切片<Base><shared_ptr>
- 我可以在 iOS 或 mac 应用程序中使用C++代码吗?
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 从 std<Derived>::shared_ptr 的向量返回 std::shared_ptr<Base>
- 为什么 C++ 11 在 ios 类中添加了运算符 bool
- 'string'文件在带有C++文件的iOS插件上找不到
- 如何从unique_ptr返回unique_ptr的引用<Derived><Base>?
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- 如何将unique_ptr<derived>*转换为<base>unique_ptr*?
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- 文件模式标志"ios::app"是否用于删除文件(如果文件已存在)?
- 使用 C++ iOS::ate 获取错误的文件大小
- iOS::Base:Precision & SetPrecision