理解Delphi中的字符串string

delphi使用的object pascal对字符串类型提供了内建支持

一种简单的shortstring是为兼容turbo pascal等老版本
而保留的,具体实现是一个最大256字节的数组,
第0个字节保存字符串的长度,然后依次是1,2...n
结尾没有#0标识,因此老一点讲pascal的书里面都是直接用
str[0]访问字符串str的长度的……此类型已基本上被遗弃

新的所谓longstring类型是从delphi2开始引入的,因为
delphi2开始支持32位win,并加入了对pchar的内建支持
具体实现是一块动态分配的内存块,内存块的前两个dword
保存着此字符串的长度和引用计数器等等信息,
因为是用一个dword保存长度,因此字符串长度可以非常大
呵呵,具体多大其实根本没有意义,反正用不完了 :)
然后字符串的末尾以#0结束,以兼容window用的sz字符串类型
所谓pchar(str)转换,其实只是取字符串的头指针罢了
(注意这里的头指针直接指向字符串数据,不包括字符串数据头
那两个dword)

值得注意的是,delphi里面提供了一种非常强大的copy on write机制
详细一点说就是你如果把一个字符串直接复制到另外一个字符串类型
用:=复制,则delphi只是在内存中维护一份字符串数据,相当于指针赋值
而把此字符串的引用计数器加一,两个字符串变量都指向这个字符串数据
但是一旦你写了其中一个字符串,delphi则自动将此字符串在内存中
复制一遍,把你的修改反映到新的字符串数据中,这样两个变量就自动
指向不同的字符串数据,这些支持都是在底层自动实现的,如果你只是
使用标准的string类型,完全可以不关心,delphi全部自己搞定

但是麻烦的是,如果你用pchar类型,或者试图把字符串传递个其他语言
编写的模块,就必须考虑上述情况,因为一个pchar类型,其实只是一个
指向字符数组的指针,是不存在string类型中负偏移的那些数据的
虽然delphi内建提供了string与pchar的转换,但是如果跨语言

或者调用api时,某些情况下必须予以考虑……

转自http://www.codes51.com/article/detail_10458.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值