procedure TForm1.Button1Click(Sender: TObject); var s : string ; P : pointer ; i : integer ; begin s :='ABC'; P := pointer(integer(@s[1])-8) ; caption := ''; for i := 0 to 10 do begin caption := caption +' '+IntToHex(PByte(P)^,2); p:=pointer(integer(p)+1); end; end;運行結果為: 01 00 00 00 03 00 00 00 41 42 43 $41,$42,$43,為'ABC'的鍵值也就是字串數據 也就是s[1],s[2],s[3] 往前的s[0]s[-1]s[-2]s[-3]為四字節的整型值,是字串長度,也就是3 再往前的s[-4],s[-5],s[-6],s[-7]為四字節的整型值,是引用計數! 所以一個長字串所占的內存為Length(s)+8
SetLength (字串变量,50);
不然我想其他情况下它的内存长度就应该是
Length (字串变量)
length + sizeof(StrRec) + 1 + ((length + 1) and 1) StrRec = packed record
refCnt: Longint;
length: Longint;
end;refCnt记录引用计数,length记录长度((length + 1) and 1)表示length为偶数就再加1查看_NewWideString可知如果是WideString把Length*2后调用_NewAnsiString
var
s : string ;
P : pointer ;
i : integer ;
begin
s :='ABC';
P := pointer(integer(@s[1])-8) ;
caption := '';
for i := 0 to 10 do
begin
caption := caption +' '+IntToHex(PByte(P)^,2);
p:=pointer(integer(p)+1);
end;
end;運行結果為: 01 00 00 00 03 00 00 00 41 42 43
$41,$42,$43,為'ABC'的鍵值也就是字串數據 也就是s[1],s[2],s[3]
往前的s[0]s[-1]s[-2]s[-3]為四字節的整型值,是字串長度,也就是3
再往前的s[-4],s[-5],s[-6],s[-7]為四字節的整型值,是引用計數!
所以一個長字串所占的內存為Length(s)+8