加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 何时为局部变量分配空间?

发布时间:2020-12-15 04:16:46 所属栏目:大数据 来源:网络整理
导读:例 function Test: Boolean;var a,b,c: Integer;begin ...end; 当执行包含这样的代码的程序时,每次调用Test时是分配a,b和c,还是在执行的初始化阶段只分配一次?我问这个是因为调试器中没有这样的信息. 解决方法 这是一个更精确的版本. 分配局部变量: 通常在
function Test: Boolean;
var
  a,b,c: Integer;
begin
  ...
end;

当执行包含这样的代码的程序时,每次调用Test时是分配a,b和c,还是在执行的初始化阶段只分配一次?我问这个是因为调试器中没有这样的信息.

解决方法

这是一个更精确的版本.

分配局部变量:

>通常在堆栈上;
>在寄存器中,如果优化器可以使用它:例如,一个只有一个循环的简单方法和一个声明为局部变量的var i:integer可能会将i分配为CPU寄存器,以获得更好的速度.

如何分配堆栈?

在x86和x64方案上,编译器具有相同的过程:

>它首先在编译时计算所需的所有空间;
>它生成代码以在堆栈上保留此空间(例如MOV EBP,ESP; SUB ESP,16);
>它生成代码来初始化在堆栈上分配的引用计数变量(例如字符串) – 其他类型的变量(如整数)没有默认值,并且可以是堆栈中的任何随机内容;
>如果存在一些引用计数变量,它会生成一个隐藏的try..finally阻止;
>它为函数/方法的内部生成代码;
>现在这里是函数/方法的最后一部分:它生成代码以释放所有引用计数变量;
>它生成代码以释放堆栈上的空间(例如MOV ESP,EBP);
>它生成返回调用函数的代码.

大多数情况下,会创建一个“堆栈帧”(由寄存器EBP指向):它用于直接访问堆栈上分配的所有变量.

对函数的结果变量有一个特定的处理:有时,它是一个CPU / FPU寄存器,有时,它是由调用者初始化的变量,并作为附加参数传递.

在x64上,它有点复杂,因为异常处理不相同,并且如果存在内部调用,则所有寄存器都需要在堆栈上分配一些空间.

在Mac OS上,存在一些对齐问题.

所有这些堆栈分配/初始化过程就是为什么对于一些小函数/方法,将内联声明它们会使代码更快执行:如果函数内的进程非常简单,所有这些堆栈处理有时会很慢.

对于more details,see the official Delphi documentation.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读