编译器特定的内存初始化

Compiler specific memory initialization

本文关键字:内存 初始化 编译器      更新时间:2023-10-16

有没有办法确保整个程序的某些对象的静态对象初始化顺序。我有内存分配器,我希望将其作为程序中的第一件事进行分配,因为它们将在整个程序中的其他地方使用,我想使用这些分配器来分配所有以后的内存。

我知道这可能是特定于编译器的,因为我不相信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++常见问题解答中所述:

http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.15

与其尝试控制静态初始化,这只会在将来导致您数小时或更长时间的荒谬调试时间,不如在main开始时分配内存池。然后,您仍然可以获得预先分配的内存,而没有静态初始化的所有陷阱。