gpt4 book ai didi

c++ - 结构不在内存中

转载 作者:行者123 更新时间:2023-12-02 03:24:50 25 4
gpt4 key购买 nike

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

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

在此声明之后,在另一个进程中,我打开包含该结构的进程并搜索具有该结构的 double 的字节数组,但什么也没找到。

要获得结果,我需要添加类似 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 或其他模式查找器搜索数组

最佳答案

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

它只是程序的描述

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

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

因此,编译器没有理由将其放入可执行程序中。所以,事实并非如此。

有些人称之为“优化”。该实例已“优化掉”。我更喜欢称其为常识:该实例从来都不是您程序的真正一部分。

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

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

关于c++ - 结构不在内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59455972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com