如果我不将它保存在变量中,则存储在内存中的函数的返回值在哪里?

时间:2015-02-08 16:43:28

标签: delphi

如果我不将它保存在变量中并且它保留多长时间,那么存储在内存中的函数的返回值在哪里?在使用返回值后,它是否被另一个函数或执行立即覆盖?如果内存停留一段时间,我如何手动强行覆盖该内存?

调用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语句”比较时......

  • 我可以假设它的结果存储在内存中以便能够 与?相比较。
  • 我可以假设很快会覆盖/丢弃该内存 因为它不再需要了吗?
  • 如果我想要它,我该如何确保它被立即丢弃?
  • 调试上述程序的人是否能够读取该内存 当比较完成并因此能够看到什么价值 是GetAValue在那个阶段返回的?

1 个答案:

答案 0 :(得分:4)

可能取决于优化设置。在EAX中返回一个整数值。启用优化后,我希望编译器使用EAX中返回的值直接执行比较。在禁用优化的情况下,编译器可能会解压缩到堆栈上的临时本地。您可以检查编译器发出的代码。

当覆盖寄存器和/或堆栈值时,取决于此片段周围的代码。

但是,任何调试人员都可以清楚地看到这个值。它在EAX寄存器中。事实上,它并没有存储在一个名为Delphi的变量中。由于代码使用该值,因此调试器可以看到它。在调试程序后,您无法隐藏任何内容。

为了完整起见,以下是问题列表的答案:

  

我可以假设它的结果存储在内存中以便与之比较吗?

没有。该值可以存储在寄存器中。

  

我可以假设这个内存很快就会被覆盖/丢弃,因为它不再需要了吗?

没有。编译器不会写出代码来显式覆盖不再使用的内存。陈旧的价值可能会持续存在。

  

如果我想要它,我如何确保它被立即丢弃?

找出它的存储位置,并覆盖该位置。如上所述,这不会有帮助。

  

调试上述程序的人是否可以在比较完成后读取该内存,从而能够看到GetAValue在该阶段返回的值是什么?

是。调试器可以看到一切。