【问题标题】:Structure not in memory结构不在内存中
【发布时间】:2020-04-14 18:44:25
【问题描述】:

我创建了一个这样的结构:

struct Options {
    double bindableKeys = 567;
    double graphicLocation = 150;
    double textures = 300;
};
Options options;

在此声明之后,在另一个进程中,我打开包含该结构的进程并使用该结构的双精度搜索字节数组,但没有找到。

要获得结果,我需要在声明后添加 std::cout << options.bindableKeys; 之类的内容。然后我从我的模式搜索中得到一个结果。 为什么会这样?有什么解决办法吗?

最小的可重现示例:

struct Options {
    double bindableKeys = 567;
    double graphicLocation = 150;
    double textures = 300;
};
Options options;
while(true)  {
    double val = options.bindableKeys;
    if(val > 10)
        std::cout << "test" << std::endl;
}

您可以使用 CheatEngine 或其他模式查找器搜索数组

【问题讨论】:

  • 如果你不使用它,编译器可能会将其优化掉。
  • 几行之后我一直使用它。
  • 如果不使用,则不会链接。即使它被链接,它也需要足够大的使用,编译器无法看穿它并优化它。
  • @heromato 那么它可能是在第一次使用时创建的,而不是在您在代码中“创建”时创建的。
  • 无法想象你想说什么。请详细说明

标签: c++ memory struct


【解决方案1】:

与流行的看法相反,C++ 源代码不是提供给执行计算机的指令序列。它不是可执行文件将包含的内容的列表。

这只是程序的描述

您的编译器负责创建一个可执行程序,该程序遵循您在源代码中描述的相同语义逻辑叙述

创建一个Options 实例很好,但是如果创建它没有做任何事情(没有副作用)并且你从不使用它的任何数据,那么它可能不存在,因此不程序的逻辑叙述的一部分。

因此,编译器没有理由将其放入可执行程序中。所以,它没有。

有些人称之为“优化”。该实例已“优化”。我更愿意称其为常识:实例从未真正成为您程序的一部分。

即使您确实使用了实例中的数据,也有可能创建一个更直接使用该数据的可执行程序。在您的情况下,不会更改 Option 成员的默认值,因此没有理由将它们包含到程序中:if 语句可以只将 567 烘焙到其中。然后,由于它被烘焙,整个条件变成了常量表达式567 &gt; 10,它必须始终为真;您可能会发现生成的可执行程序因此不包含任何分支逻辑。它只是启动,然后一遍又一遍地输出"test",直到你强制终止它。

话虽如此,因为我们生活在一个受物理定律支配的世界中,而且因为编译器并不完美,所以这种抽象总是会有一些轻微的泄漏。出于这个原因,您可以欺骗编译器认为该实例是“使用”的,需要在可执行文件中更正式地表示它的存在,即使这不是实现所描述的程序所必需的。 This is common in benchmarking code.

【讨论】:

  • @heromato 对!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 2019-10-03
相关资源
最近更新 更多