单个过程可以声明的最大局部变量是多少?

时间:2016-11-24 09:58:03

标签: delphi

在Delphi下,在单个程序中声明许多变量是否有任何问题?我知道提示警告不会超过32个变量(至少在XE4上,不知道这在柏林仍然是真的),但是他可以有任何其他问题吗?

例如:

procedure xxx;
var A,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z: single;
    A1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,r1,s1,t1,u1,v1,w1,x1,y1,z1: single;
begin
 ...
end;

1 个答案:

答案 0 :(得分:3)

Technically?否,

局部变量的数量没有实际限制 局部变量存在于堆栈中,因此受到允许的最大堆栈大小的限制 在Windows上,默认值为1兆字节(尽管应用程序可以在PE标头中覆盖此默认值)。

以下示例说明了这一概念:

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

procedure LocalVars;
const
  tooMany = 1024 * 1024 * 1;  //1 MB
var
  i: integer;
  test: array[0..toomany] of byte;
begin  <<-- stack overflow will occur here.
  for i := Low(test) to High(test) do begin
    test[i]:= 1;
  end;
end;

begin
  try
    LocalVars
  except on e:exception do
    WriteLn('Fail: '+e.message);
  end;
  WriteLn('done.');
  Readln;
end.

编译器创建的初始化代码将在begin语句处为(超大)数组创建堆栈空间,从而导致堆栈溢出。

您可以在linking options(项目 - &gt;选项 - &gt;链接)中增加最大堆栈大小。
我从来没有诉诸过这个黑客,而且我不认识那个人 最大可能的堆栈大小为16 MB。