局部变量:它们总是在堆栈上吗?

时间:2016-01-25 12:41:25

标签: delphi

在以下过程中,是否会在堆栈上分配数组?

procedure One:
var
  arr: array[0..1023] of byte;
begin
end;

可以进入堆栈的最大项目是什么?

在堆栈上和堆上访问变量之间是否存在速度差异?

1 个答案:

答案 0 :(得分:9)

  

在以下过程中,是否会在堆栈上分配数组?

是的,前提是匿名方法未捕获局部变量。这些局部变量驻留在堆上。

  

可以进入堆栈的最大项目是什么?

它取决于堆栈的大小,以及已经使用了多少堆栈,以及函数本身进行的调用使用了多少堆栈。堆栈是固定大小,在创建线程时确定。如果堆栈超出该大小,则堆栈溢出。至少在Windows上,默认的堆栈大小是1MB,所以我不希望你遇到1KB阵列的问题,如下所示。

  

在堆栈上和堆上访问变量之间是否存在速度差异?

总的来说没有,但这又取决于。堆栈上的变量可能更频繁地被访问,因此可能更容易被缓存。但是对于一个体积适中的对象,比如我们在这里可以看到的1KB阵列,我不希望访问时间有任何差异。就底层内存架构而言,堆栈和堆之间没有区别,它只是内存。

现在,性能差异在于分配。堆分配比堆栈分配更昂贵。特别是如果你有一个多线程应用程序,堆分配可能是一个瓶颈。特别是,默认的Delphi内存管理器在多线程使用中不能很好地扩展。