gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:52:05 29 4
gpt4 key购买 nike

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

调用 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 变量中,这与重点无关。由于代码使用该值,因此调试器可以看到它。一旦程序被调试,您就无法隐藏任何内容。

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

May I assume that the result of it is stored in memory to be able to compare with?

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

May I assume that that memory will be overwritten/discarded shortly as it will not be needed anymore?

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

How do I make sure it is discarded immediately if I wanted it to be?

找出它的存储位置,并覆盖该位置。但正如所讨论的,这不会有帮助。

Will anybody debugging the above program be able to read that memory when the comparison is done and as such be able to see what the value is which GetAValue returned at that stage?

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

关于delphi - 如果我不将函数的返回值保存在变量中,则函数的返回值存储在内存中的哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28396528/

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