如果我不将函数的返回值保存在变量中,那么该函数的返回值在哪里存储?该函数在其中保留多长时间?使用返回值后,它会立即被另一个函数或执行覆盖吗?如果该内存停留了一段时间,如何手动强制覆盖它?
调用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语句”比较时,则...
这可能取决于优化设置。在EAX中返回一个整数值。启用优化后,我希望编译器使用EAX中返回的值直接执行比较。在禁用优化的情况下,编译器可能会解压缩到堆栈上的临时本地。您可以检查编译器发出的代码。
寄存器和/或堆栈值的确切覆盖时间取决于该片段周围的代码。
但是,调试任何人都可以看到该值。它在EAX寄存器中。它没有存储在命名的Delphi变量中的事实不重要。由于代码使用该值,因此调试器可以看到它。调试完程序后,您什么也无法隐藏。
为了完整起见,以下是问题的重点列表的答案:
我是否可以假设将其结果存储在内存中以便进行比较?
否。该值可以存储在寄存器中。
我是否可以认为内存将很快被覆盖/丢弃,因为不再需要它了?
不会。编译器不会写出代码来显式覆盖不再使用的内存。过时的值可能会持续存在。
我要如何确保立即将其丢弃?
找出它的存储位置,然后覆盖该位置。如前所述,这将无济于事。
完成比较后,调试上述程序的任何人都能够读取该内存,从而能够看到该阶段返回的GetAValue的值是什么吗?
是。调试器可以看到所有内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句