function Test: Boolean;
var
a, b, c: Integer;
begin
...
end;
Run Code Online (Sandbox Code Playgroud)
当执行包含这样的代码的程序,是a
,b
和c
每个时间分配Test
被调用时,或者是它们在执行的初始化阶段仅分配一次某处?我问这个是因为调试器中没有这样的信息.
这是一个更准确的版本。
局部变量分配:
var i: integer
声明为局部变量的简单方法可能会分配i
为 CPU 寄存器,以获得更好的速度。栈是如何分配的?
在x86和x64方案上,编译器都有相同的过程:
MOV EBP,ESP; SUB ESP,16
);string
) - 其他类型的变量(例如integer
)没有默认值,并且可以是堆栈上的任何随机内容;try..finally
如果有一些引用计数变量,它会生成一个隐藏块;finally
函数/方法的一部分:它生成代码来释放所有引用计数变量;MOV ESP,EBP
);大多数时候,EBP
会创建一个“堆栈帧”(由寄存器指向):它用于直接访问堆栈上分配的所有变量。
函数的变量有一个特定的处理result
:有时,它是一个CPU/FPU寄存器,有时,它是由调用者初始化的变量,并作为附加参数传递。
在 x64 上,情况有点复杂,因为异常的处理方式不同,并且如果存在内部调用,所有寄存器都需要在堆栈上分配一些空间。
在 Mac OS 上,存在一些对齐问题。
所有这些堆栈分配/初始化过程就是为什么对于一些小函数/方法来说,声明它们inline
将使代码执行得更快:如果函数内的过程非常简单,所有这些堆栈处理有时会很慢。
更多详细信息请参见Delphi官方文档。