在Delphi中字符串類型爲String,有ShortString, AnsiString, WideString三種
類型 最大長度 佔用內存
ShortString 255 2-256 向後兼容
AnsiString 大約2^31 4字節-2G 8位(ANSI)字符
WideString 大約2^30 4字節-2G 多用戶服務和多語言程序
缺省的編譯選項下,編譯器認爲String就是AnsiString字符串(可以使用$H編譯開關
來進行修改)。
一,AnsiString的內部格式
AnsiString能夠根據需要動態的分配字符串空間,並且具有自動回收的功能。它以null
字符結束,所以可以通過PCahr轉換成爲與WindowsAPI兼容的字符串。AnsiString類型
在內存中實際上是以以下形式存在的:
+++++++++++++++++++++++++++++++++
| 4字節分配的大小 |
+++++++++++++++++++++++++++++++++
| 4字節引用計數 |
+++++++++++++++++++++++++++++++++
| 4字節長度 |
+++++++++++++++++++++++++++++++++
| ...不定長度字符串... |
+++++++++++++++++++++++++++++++++
| #0 |
+++++++++
AnsiString實際上是指向字符串結構的指針。例如:
var
str: AnsiString;
begin
str := 'abcd';
Memo1.Lines.Add('AnsiString Size: ' + IntToStr(SizeOf(AnsiString)));
Memo1.Lines.Add('str Size: ' + IntToStr(SizeOf(str)));
end;
程序的輸出結果總是爲4。也就是說AnsiString類型的變量實際上是一個指針。
因爲Borland公司保留了在Delphi以後版本中修改字符串內部格式的權利,所以在程序
中要避免使用依賴於字符串內部格式的代碼。
下面一個例子說明AnsiString在內存中的內部格式:
var
str: String;
procedure TForm1.Button1Click(Sender: TObject);
begin
str := 'abcd';
Memo1.Lines.Text :=
'分配大小: ' + IntToStr(PInteger(Integer(str) - 12)^) + #13#10 +
'引用計數: ' + IntToStr(PInteger(Integer(str) - 8)^) + #13#10 +
'字串長度: ' + IntToStr(PInteger(Integer(str) - 4)^) + #13#10 +
'字串: ' + PChar(Integer(str));
end;
輸出結果:
分配大小: 22
引用計數: 1
字串長度: 4
字串: abcd
是字串長度+17,不知道是不是分配大小4 + 引用計數4 + 字串長度4 + #0結束符1
+ 字符串指針4 = 17
delphi Ansistring wideString shortstring
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.