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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值