编译器特定的内存初始化
Compiler specific memory initialization
有没有办法确保整个程序的某些对象的静态对象初始化顺序。我有内存分配器,我希望将其作为程序中的第一件事进行分配,因为它们将在整个程序中的其他地方使用,我想使用这些分配器来分配所有以后的内存。
我知道这可能是特定于编译器的,因为我不相信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
开始时分配内存池。然后,您仍然可以获得预先分配的内存,而没有静态初始化的所有陷阱。
相关文章:
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 如何在 malloc 内存中初始化非 POD 数据
- 犰狳C++ - 从常量内存初始化只读矩阵而不复制
- 内存清理程序报告全局对象构造中未初始化值的使用
- 如何根据C++在同一内存位置重新初始化 C# 中的对象(还是自动完成)?
- 为什么"std::uninitialized_copy"通常取消对未初始化内存的迭代器的引用不是未定
- 为什么未初始化的内存位置的值给出 -842150451 的值?
- 如果不初始化结构中的向量,它会自动为空还是具有随机内存位置的值?
- 获取有关使用未初始化内存的错误代码
- 初始化值是否保证通过其自己的地址反映,而不考虑内存顺序
- 未找到匹配的运算符删除;如果初始化引发异常,内存将不会被释放
- Clang++ 6.0 内存清理器未报告返回值指示条件分支的函数中的未初始化局部变量
- 在不放置新运算符的情况下,在预分配的内存上使用虚函数初始化对象 - 这可能吗?如果没有,为什么
- 取消初始化内存区域
- 初始化原子指针是原子的吗?如果初始化或内存分配引发,会发生什么情况?
- 如何使用构造函数初始化内存地址(指针变量)?
- 将类复制到未初始化的内存中是否安全?
- 内存初始化/删除这么耗时吗
- 共享内存初始化和访问
- 编译器特定的内存初始化