欢迎来到天天文库
浏览记录
ID:41560696
大小:73.39 KB
页数:18页
时间:2019-08-27
《Delphi字符串类型浅析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Delphi字符串类型浅析收藏参考资料«Delphi5开发人员指南》“第2章ObjectPascal语言”《PASCAL精要》“第7章字符串操作”aDelphi中String类型和Char类型的比较”uObjectPascal中String类型的内幕探讨”基本知识字符串类型•AnsiString这是Pascal缺省的字符串类型,它由AnsiChar字符组成,其长度没有限制,同时与null结束的字符串相兼容。•ShortString保留该类型是为了向后兼容Delphi1.0,它的长度限制在255个字符内。•WideString功能上类似于AnsiStri
2、ng,但它是山WideChar字符(UniCode字符集)组成的。引入这种类型,主要是为了支持OLE编程。•PChar指向null结束的Char字符串的指针,类似于C的char*或lpstr类型。•PAnsiChar指向null结束的AnsiChar字符串的指针。•PWideChar指向null结束的WideChar字符串的指针。字符类型•AnsiChar,以8位表示(共有256个不同的符号)。•WideChar,以16位表示(共有64,000个不同的符号)。String类型注意:以下是指Delphi2007以前的编译器(包括Delphi2007)o1
3、、缺省情况下,如果用如下的代码来定义字符串,编译器认为是AnsiString字符串:varS:string;//编译器认为S的类型是AnsiString2、编译开关$日“$H编译开关”的值川来决定当变量声明为string时,它是被当作AnsiString类型还是被当作ShortString类型。当“$H”值为负时,string变量是ShortString类型;当“$H”值为正时(缺省情况),string变量是AnsiString类型。下而的代码演示了这种情况:var{$H-}Sl:string;//S1是ShortString类型{$H+}S2:str
4、ing;//S2是AnsiString类型使用$H规则的一个例外是,如果在定义时特地指定了长度(最大在255个字符内),那么总是ShortStringovarS:string[63];//63个字符的ShortString字符串Ch如类型1、Delphi2007以前的编译器(包括Delphi2007)缺省情况下认为Char是AnsiChar类型,PCharPAnsiChar类型。2、Delphi2009的编译器缺省情况下认为Char是WideChar类型,PChar是PWideChar类型。请注意,没有任何方法可变更这个新的编译器预设设定。对于字符串类
5、型而言,会以固定的硕式编码方式将Char类型对应到特定的数据类型。AnsiString类型1、AnsiString是生存期自管理类型。2、AnsiString字符串总是以null字符结束的,这使得AnsiString字符串能与Win32API中的字符串兼容。3、AnsiString类型是一个指向在堆栈中的字符串结构的指针。口J以使用Sizeof去读取AnsiString类型的大小,不论字符巾的实际长度是多少,Sizeof(AString)永远是4。4、AnsiString字符串在内存中分配的情况注意:在Delphi?.0以后版本中,不能再通过字符串的第
6、0个元素來设置或得到字符串的长度,只能通过Length()函数来得到字符串的长度,通过SetLengthOil稈来设置字符串的长度。Borland并不保证String的内存结构在以后的Delphi版木中会保持不变。(1)、Delphi5内存结构如卜:(2)、Delphi7内存结构如下:AnsiString指向一块内存起始偏移8字节处,前而8字节依次为引用计数和长度计数两个整数。(1)、Delphi2009内存结构如下:-12-10・8-4最后一位字码页字符大小引川计数字串长度字串内容0除了字串长度及引川计数外,新的AnsiString格式包括字符人小及
7、字码页。字符人小可用来区分AnsiString及UnicodeString,而字码页特别适用于AnsiString类型(可用于Delphi2009),UnicodeString类型的字码页则固定为1200,字码包括UTF・8、GBK等,例如“$03A8就是936,查MSDN936-gb2312”。5、AnsiString字符串的引用计数机制。(1)、AnsiString字符串基于引用计数机制,通过引用计数追踪内存中引用同一字符串的字符串变量。(2)、编译器生成的代码会在操作一个AnsiString字符串前把引用计数+1,操作结束灰引用计数・1,如果引用
8、计数=0时就自动释放整块内存。(3)、AnsiString字符串的复制在拷贝字符串的时候,Ob
此文档下载收益归作者所有