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

Mic*_*ent 8 delphi

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

procedure One:
var
  arr: array[0..1023] of byte;
begin
end;
Run Code Online (Sandbox Code Playgroud)

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

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

Dav*_*nan 9

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

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

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

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

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

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

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

  • 在上面的过程中FWIW,堆栈上没有任何内容,因为编译器将删除该变量,因为它未被使用.所以这取决于所述程序的实施.通常,是的,局部变量在堆栈上,除非它们被匿名方法捕获 - 在这种情况下,它们作为支持匿名方法的对象实例的一部分在堆上. (2认同)