【问题标题】:C++ Initialize Variable in .data SectionC++ 初始化 .data 部分中的变量
【发布时间】:2020-03-18 03:34:31
【问题描述】:

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

int i = 10;
int s = i * 12;

int main(){ }

当您查看 PE 格式的代码时,您会注意到,在 .data 段中既没有声明 i 也没有声明 s,尽管它们的值可能已经预先计算过了。它们在运行时被初始化。

这里我有另一个代码的例子,它有同样的现象。值也像上面的示例一样声明

在通过EntryPoint之前在Debugger中查看:

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  ................  

如何在 C++ 的 .data 部分中声明一个具有初始值的变量以节省宝贵的计算时间?

或者 .data 部分在执行开始之前从未被初始化过?

【问题讨论】:

  • 使用constexpr ?那样的话,担心优化通常是在浪费时间。
  • 我相信如果您将变量 i 和 s 设为静态,它们将被放置在 .data 段中。或者,如果它们是常量,您可以使用 constexpr 而不是 static。
  • 一个适当的优化编译器只会删除所有这些。始终使用优化构建测试与性能相关的东西。
  • 我感觉您正在查看调试代码,在这种情况下,一切都是徒劳的。
  • @Acorn 谢谢它解决了

标签: c++ visual-studio variables optimization


【解决方案1】:

如果这些是编译时常量,请使用constexpr。

constexpr int i = 10;
constexpr int s = i * 12;

从 C++17 开始,这些也是 inline 变量,因此您可以在头文件中声明它们,而不必担心有多个定义。

如果这些不是常量,但您希望它们被常量初始化,那么您至少可以使用static 使它们具有内部链接,从而更有可能发生优化。从 C++20 开始,您可以使用 constinit 指定变量将进行静态初始化,但可以稍后在程序中进行更改。

【讨论】:

  • 没错,被constinit 转移了方向,它没有声明一个常量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多