c++ - vector 的 Schwarz 计数器

标签 c++ c++11

我正在考虑这样一种情况,我需要保证在各种翻译单元中的某些静态对象之前初始化(构造)全局静态 std::vector。

当我查找如何处理这个问题时,我遇到了两个建议的解决方案:

  1. 在用于代替全局静态对象的全局函数中有一个静态对象。
  2. 施瓦茨柜台

我对使用 Schwarz 计数器的担心是 std::vector 将被初始化两次。来自 this链接 我得到“确保全局对象仅在第一次使用之前初始化一次的有用技术是维护使用它的翻译单元的数量。”

全局仅初始化一次是如何工作的?根据我的推理,它将被初始化两次。一次是在静态初始化的正常过程中,一次是在初始化 Schwarz 计数器的第一个实例时。

相关说明,Schwarz 计数器构造函数中的初始化代码是什么样的?我只能考虑使用新的展示位置。

最佳答案

我只能说我过去是如何实现的:我设计 一个特殊的“无操作”构造函数,它什么都不做,并使用 Schwartz 柜台的新品。像这样的东西:

class ForUseAsStatic
{
public:
    enum MakeCtorNoop { makeCtorNoop };
    ForUseAsStatic();   //  normal ctor, called by Schwartz counter.
    ForUseAsStatic( MakeCtorNoop );
                        //  no-op constructor, used when
                        //  defining the variable.
};

形式上,这不能保证——允许编译器 在调用构造函数之前再次将内存设置为 0, 但我从来没有听说过有这样的编译器。

也可以在类中放置某种标志 本身,由构造函数测试。这仅适用于 静态对象,当然(因为它需要零初始化 为了工作)。

另一种可能的技术(我已经看到在一些 libraries) 是声明对象的内存 汇编程序,或者作为字节数组,如果编译器有一些方法 强制对齐。数据名称通常不会被破坏,所以这个 通常会起作用,即使它是正式未定义的行为。 (当然,对于标准库,库作者可以 在编译器中请求扩展以帮助他们 问题。)

最后:今天,单例成语或类似的东西是 通常更喜欢这种解决方法。这确实意味着你 必须编写 myobj().xxx,而不仅仅是 myobj.xxx,但是 这通常不是问题。

关于c++ - vector 的 Schwarz 计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18193397/

相关文章:

c++ - 堆栈跟踪中的 "pure virtual"调用是什么意思?

c++ - 为什么 C++ 禁止声明无类型的参数?

C++:OpenGL、glm 和结构填充

c++ - 同时为类及其成员继承和多态(shared_ptr,C++11)

c++ - 复制原始类型行为的 std::vector

c++ - 输入迭代器可以重复读取而输出迭代器只能写入一次?

c++ - 将矩阵扩展为 block 矩阵 - 索引问题

c++ - 实现 unique_unlock,与 std::unique_lock 相反

c++ - 继承构造函数和默认构造函数

c++ - 为什么我不能在函数中使用 constexpr 值,但我可以在这个值的范围内做同样的事情?