delphi Ansistring wideString shortstring

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章