DELPHI之关于字符串

短字符串:

至少分配一个字节,其首地址用来存放字符串的长度,称为计数位,其后,开始存放字符串中的各个字符。(注:堆栈是以4字节为单位进行分配的,这可能造成字符的长度与实际内存空间不一致)

PChar:

以Null结尾字符串规则的数据类型,由于没有使用的内存块都可以是Null的,所以以Null结尾的字符串是一个弱类型检测的定义

AnsiString:

缺省以String关键字定义的,或者直接以AnsiString关键字定义的字符串变量都是长字符串,长字符串的首地址和短字符串的的首地址作用一样是用来存放字符串长度,并和PChar一样以Null结尾,长字符能以字符数组形式时进行操作。

长字符串变量总是占用4字节,空值的长字符串内存点用为0字节,非空值的长字符串的内存占用为:串长+8字节+1字节。

这里的“1字节”我们可以猜到是为了存放结束符"Null“,那么那”8字节“是用来做什么的呢?其实编译器在负偏移的位置占用了8个字节,前4个字节保存串长,后4个字节保存引用计数。

(

字符串的引用计数与写复制:

在编译期,如果能确知两个字符串相同,则编译器会为这两个字符串分配相同的内存

赋值操作时两个字符串占用同一个内存区域

修改字符串的操作,会导致两个字符开始占用不同的内存,修改时编译器会进行“写复制”

以数组的形式访问字符串中的元素时,整个字符串会发生“写复制”

)

WideString:

在内存结构上,WideString为了和Null结尾的字符串兼容,在字符串的结尾是以#0字符(两个字节)结束的。为了和AnsiString兼容,WideString在字符串的负偏移处也加上了长度位占4字节,在长度位上,保存的值是字符串占用的字节数,而非字符个数!然而当我们用Length()操作时,会得到串的个数,所以直接操作长度位是不安全的。WideString没有引用计数机制。