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

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

  • 在全局函数中有一个静态对象,该静态对象代替了全局静态对象。
  • Schwarz计数器

  • 我对使用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,
    但是我从来没有听说过这样的编译器。

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

    另一种可能的技术(我见过一些
    库)是为了声明对象的内存
    汇编程序,或者如果编译器具有某种方式可以作为字节数组
    强制对齐。数据名称通常不整齐,因此
    即使它是形式上未定义的行为,也通常会起作用。
    (对于标准库,当然,库作者可以
    在编译器中请求扩展,以帮助他们
    问题。)

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

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

    10-13 07:56