如何避免延迟静态存储持续时间变量的初始化?

问题描述 投票:0回答:0

我有类在它们的构造函数中有副作用,这些类的对象是具有静态存储持续时间的全局对象。在初始化期间,这些对象在一个特殊的映射中注册它们的类,并且在该映射用于其他目的之前进行这些注册很重要。

类及其全局对象在单独的翻译单元中定义,根据非块变量规则的动态初始化,初始化可以推迟到使用这些翻译单元中的其他函数或变量,这可能意味着初始化被无限期推迟。

我正在寻找一种方法来避免这些全局对象的延迟初始化。说我的意思是对象的构造函数应该在

main
之前或刚开始之后被调用,但是所有的改变都应该在这些对象的翻译单元内完成。换句话说,无论何时添加一个具有全局对象的翻译单元,都不应修改其他翻译单元。

更新:这里是一个例子:

struct Base {
};

extern void regFactoryMethod(std::function<std::shared_ptr<Base>()>);

struct Object : Base {
    struct Registrator {
        Registrator() {
            regFactoryMethod([](){ return std::make_shared<Object>(); });
        }
    };
    static Registrator registrator;
};

Object::Registrator Object::registrator;

思路就是自动调用

Object::Registrator::Registrator()
。但不能保证它会,因为这个电话可能会被推迟:

是否动态初始化是实现定义的 具有静态存储持续时间的非块非内联变量是 在 main 的第一条语句之前排序或被推迟。如果是 延迟,它强烈发生在任何非初始化 ODR 使用之前 在同一个定义的任何非内联函数或非内联变量 翻译单元作为要初始化的变量。这是 实现定义在哪些线程中以及在哪些点 发生这种延迟动态初始化的程序。

c++ side-effects static-initialization storage-duration translation-unit
© www.soinside.com 2019 - 2024. All rights reserved.