C++ 初始化 .data 部分中的变量
C++ Initialize Variable in .data Section
我在问自己,如何改进代码。如果遇到以下问题:
int i = 10;
int s = i * 12;
int main(){ }
当您查看 PE 格式的代码时,您会注意到,i 和 s 都没有在 .data 段中声明,尽管它们的值可能是预先计算的。它们在运行时初始化。
在这里,我举了另一个具有相同现象的代码的例子。值也声明如上例所示
在传递入口点之前在调试器中查看:
0133BF7C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0133BF8C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
通过入口点后:
0133BF7C E9 01 00 00 DF 02 00 00 64 00 00 00 00 00 00 00 é...ß...d.......
0133BF8C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
如何在 .data 部分中声明具有初始值的变量C++以节省宝贵的计算时间?
还是在执行开始之前从未使用 .data 部分初始化过?
如果这些是编译时常量,请使用constexpr
.
constexpr int i = 10;
constexpr int s = i * 12;
从 C++17 开始,这些也是inline
变量,因此您可以在头文件中声明它们,而不必担心有多个定义。
如果这些不是常量,但您希望它们被常量初始化,那么您至少可以使用static
使它们具有内部链接,从而使优化更有可能发生。从 C++20 开始,您可以使用constinit
指定变量具有静态初始化,但稍后可以在程序中进行更改。
相关文章:
- 为什么C++有不同的变量初始化方式?
- 静态 constexpr 成员变量初始化
- C++不同的变量初始化
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- 是变量初始化失败吗?
- 视觉C++:在 DLL 加载期间,全局变量初始化顺序是否具有确定性?
- 类静态变量初始化顺序
- 使用 constinit 变量初始化 constexpr 变量
- 是否可以在不修改父类的情况下将成员变量初始化推迟到继承的类?
- 使用全局变量初始化不同编译单元中的其他全局变量
- 使用默认构造函数引用成员变量初始化错误
- 宏的 if 语句中的变量初始化
- 不稳定的C :每行适应性变化多变量初始化
- 同一函数中的静态函数变量初始化顺序
- C 语言中的静态变量初始化
- 错误:调用'begin(long double [nPoints])'没有匹配函数;使用硬编码的 int 与整数变量初始化向量
- 类POD成员变量初始化
- 尝试捕获类变量初始化的范围
- 共享库中 __attribute__((构造函数)) 的全局/静态变量初始化问题
- 多变量初始化编译器支持