procedure xxx;
var
  a : array[0..4095]of char;
begin
  ....请问,每次调用这个函数的时候,系统都要为a在栈上分配内存吗?还是程序初始化的时候只分配一次?UP有分~~~~~~~~~~~

解决方案 »

  1.   

    程序初始化的时候只有全局静态变量会在数据区分配地址,局部变量当然是在调用proc的时候栈上分配了.
      

  2.   

    //做了几个实验,请参考 (环境是:Delphi6 + WinXP)No.1 每次执行,a的地址没有发生改变,说明a不是每次都分配内存
    procedure xxx;
    var
      a: array[0..4095] of char;
    begin
      ShowMessage('$' + IntToHex(Integer(@a), 8));
    end;No.2 每次a[0]~a[3]都会被初始为$00951C9C,而a[4]以后的内容都没有被改变
    procedure xxx;
    var
      a: array[0..4095] of char;
    begin
      ShowMessage('$' + IntToHex(PInteger(@a[0])^, 8));
      PInteger(@a[0])^ := $12345678;
      ShowMessage('$' + IntToHex(PInteger(@a[4])^, 8));
      PInteger(@a[4])^ := $90ABCDEF;
    end;No.3 
    假设从No.1中取得a的地址为$0012E3FC
    再重新调整代码编译后,直接访问$0012E3FC没有出现异常
    var
      p: Pointer;
    begin
      Integer(p) := $0012E3FC;
      PChar(P)[0] := 'z';
      PChar(P)[1] := 's';
      PChar(P)[2] := 'w';
      PChar(P)[3] := 'a';
      PChar(P)[4] := 'n';
      PChar(P)[5] := 'g';
    end;暂时不写结论,请自己动手测试思考
      

  3.   

    個人認為是在初始化sub的時候已經為程序分配了內存,象canvas一樣。
      

  4.   

    >>暂时不写结论,请自己动手测试思考
    伴水大哥,你还是给个结论吧~~~~~~~自己思考很累地~~~~~~~~~~~~
      

  5.   

    不是每次都分配内存,只对前四个字节做了初始化,所以不会降低效率(除非有递归调用)
    procedure xxx1;
    var
      a: array[0..4095] of char;
    begin
      a[0] := 'a';
    end;procedure xxx2;
    var
      a: PChar;
    begin
      GetMem(a, 4096);
      a[0] := 'a';
      FreeMem(a, 4096);
    end;//效率比较测试,xxx1的效率是xxx2的3倍
    procedure TForm1.Button1Click(Sender: TObject);
    var
      I: Integer;
      vTickCount: DWORD;
    begin
      vTickCount := GetTickCount;
      for I := 1 to 100000 do xxx1;
      Caption := IntToStr(GetTickCount - vTickCount);
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      I: Integer;
      vTickCount: DWORD;
    begin
      vTickCount := GetTickCount;
      for I := 1 to 100000 do xxx2;
      Caption := IntToStr(GetTickCount - vTickCount);
    end;