procedure xxx;
var
a : array[0..4095]of char;
begin
....请问,每次调用这个函数的时候,系统都要为a在栈上分配内存吗?还是程序初始化的时候只分配一次?UP有分~~~~~~~~~~~
var
a : array[0..4095]of char;
begin
....请问,每次调用这个函数的时候,系统都要为a在栈上分配内存吗?还是程序初始化的时候只分配一次?UP有分~~~~~~~~~~~
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;暂时不写结论,请自己动手测试思考
伴水大哥,你还是给个结论吧~~~~~~~自己思考很累地~~~~~~~~~~~~
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;