在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
最新推荐文章于 2021-02-26 18:06:23 发布