我有类在它们的构造函数中有副作用,这些类的对象是具有静态存储持续时间的全局对象。在初始化期间,这些对象在一个特殊的映射中注册它们的类,并且在该映射用于其他目的之前进行这些注册很重要。
类及其全局对象在单独的翻译单元中定义,根据非块变量规则的动态初始化,初始化可以推迟到使用这些翻译单元中的其他函数或变量,这可能意味着初始化被无限期推迟。
我正在寻找一种方法来避免这些全局对象的延迟初始化。说我的意思是对象的构造函数应该在
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 使用之前 在同一个定义的任何非内联函数或非内联变量 翻译单元作为要初始化的变量。这是 实现定义在哪些线程中以及在哪些点 发生这种延迟动态初始化的程序。