在以下过程中,是否将数组分配到堆栈中?
procedure One:
var
arr: array[0..1023] of byte;
begin
end;
Run Code Online (Sandbox Code Playgroud)
什么是可以进入堆栈的最大项目?
访问堆栈和堆上的变量之间是否存在速度差异?
在以下过程中,是否将数组分配到堆栈中?
是的,前提是匿名方法未捕获局部变量.这些局部变量驻留在堆上.
什么是可以进入堆栈的最大项目?
它取决于堆栈的大小,以及已经使用了多少堆栈,以及函数本身的调用使用了多少堆栈.堆栈是固定大小,在创建线程时确定.如果堆栈超出该大小,则堆栈溢出.至少在Windows上,默认堆栈大小为1MB,因此我不希望您遇到1KB阵列的问题,如此处所示.
访问堆栈和堆上的变量之间是否存在速度差异?
总的来说没有,但这又取决于.堆栈上的变量可能更频繁地被访问,因此可能更容易被缓存.但是对于一个体积适中的对象,比如我们在这里可以看到的1KB阵列,我不希望访问时间有任何差异.就底层内存架构而言,堆栈和堆之间没有区别,它只是内存.
现在,性能差异在于分配.堆分配比堆栈分配更昂贵.特别是如果你有一个多线程应用程序,堆分配可能是一个瓶颈.特别是,默认的Delphi内存管理器在多线程使用中不能很好地扩展.