有没有办法确保整个程序的某些对象的静态对象初始化顺序。我有内存分配器,我希望将其作为程序中的第一件事分配,因为它们将在整个程序的其他地方使用,我想使用这些分配器来分配所有以后的内存。
我知道这可能是特定于编译器的,因为我不相信 C++ 标准允许这样做。我感兴趣的两个编译器是 gcc 和 VS2010 的编译器。如果有办法,有人可以解释一下吗?
编辑
我不想“在第一次使用时构造”,因为分配器将分配一大块我想在程序开始时初始化的内存。
有没有办法确保整个程序的某些对象的静态对象初始化顺序。我有内存分配器,我希望将其作为程序中的第一件事分配,因为它们将在整个程序的其他地方使用,我想使用这些分配器来分配所有以后的内存。
我知道这可能是特定于编译器的,因为我不相信 C++ 标准允许这样做。我感兴趣的两个编译器是 gcc 和 VS2010 的编译器。如果有办法,有人可以解释一下吗?
编辑
我不想“在第一次使用时构造”,因为分配器将分配一大块我想在程序开始时初始化的内存。
通过使用编译器特定的指令,您可以在一定程度上影响初始化的顺序。MSVC 有一个编译指示
#pragma init_seg({ compiler | lib | user | "section-name" [, func-name]} )
这可以在某种程度上设置特定模块的优先级。请参阅此参考以获取init_seg。
gcc 编译器具有类似/相关的属性语法,用于设置特定初始化的相对优先级。看起来像这样
Some_Class A __attribute__ ((init_priority (2000)));
Some_Class B __attribute__ ((init_priority (543)));
并在此页面上的init_priority上进行了解释。
我猜你指的是静态初始化顺序惨败,当基于另一个静态变量的状态初始化静态变量时,你的程序有机会调用未定义的行为(可能有也可能没有它的构造函数当时打电话)。
此问题的解决方法是第一次使用习语的构造,在此处的 C++ FAQ 中进行了描述:
与其尝试控制静态初始化(这只会在未来给您带来数小时或更长时间的可笑调试时间),不如在main
. 然后,您仍然可以获得预先分配的内存,而不会遇到静态初始化的所有缺陷。