C++ 初始化 .data 部分中的变量

C++ Initialize Variable in .data Section

本文关键字:变量 初始化 data C++      更新时间:2023-10-16

我在问自己,如何改进代码。如果遇到以下问题:

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指定变量具有静态初始化,但稍后可以在程序中进行更改。