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