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

模糊强

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

调用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的值是什么吗?
戴维·赫弗南

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

寄存器和/或堆栈值的确切覆盖时间取决于该片段周围的代码。

但是,调试任何人都可以看到该值。它在EAX寄存器中。它没有存储在命名的Delphi变量中的事实不重要。由于代码使用该值,因此调试器可以看到它。调试完程序后,您什么也无法隐藏。

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

我是否可以假设将其结果​​存储在内存中以便进行比较?

否。该值可以存储在寄存器中。

我是否可以认为内存将很快被覆盖/丢弃,因为不再需要它了?

不会。编译器不会写出代码来显式覆盖不再使用的内存。过时的值可能会持续存在。

我要如何确保立即将其丢弃?

找出它的存储位置,然后覆盖该位置。如前所述,这将无济于事。

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

是。调试器可以看到所有内容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章