如果我不将它保存在变量中并且它保留多长时间,那么存储在内存中的函数的返回值在哪里?在使用返回值后,它是否被另一个函数或执行立即覆盖?如果内存停留一段时间,我如何手动强行覆盖该内存?
调用RunProgram时请考虑以下内容......
function GetAValue : Integer;
begin
Result := {some integer value based on other conditions};
end;
procedure RunProgram;
begin
If GetAValue = 362411 then
ShowMessage('Found');
end;
因此,当调用GetAValue进行上述“If语句”比较时......
答案 0 :(得分:4)
可能取决于优化设置。在EAX中返回一个整数值。启用优化后,我希望编译器使用EAX中返回的值直接执行比较。在禁用优化的情况下,编译器可能会解压缩到堆栈上的临时本地。您可以检查编译器发出的代码。
当覆盖寄存器和/或堆栈值时,取决于此片段周围的代码。
但是,任何调试人员都可以清楚地看到这个值。它在EAX寄存器中。事实上,它并没有存储在一个名为Delphi的变量中。由于代码使用该值,因此调试器可以看到它。在调试程序后,您无法隐藏任何内容。
为了完整起见,以下是问题列表的答案:
我可以假设它的结果存储在内存中以便与之比较吗?
没有。该值可以存储在寄存器中。
我可以假设这个内存很快就会被覆盖/丢弃,因为它不再需要了吗?
没有。编译器不会写出代码来显式覆盖不再使用的内存。陈旧的价值可能会持续存在。
如果我想要它,我如何确保它被立即丢弃?
找出它的存储位置,并覆盖该位置。如上所述,这不会有帮助。
调试上述程序的人是否可以在比较完成后读取该内存,从而能够看到GetAValue在该阶段返回的值是什么?
是。调试器可以看到一切。