我也不明白。
我只知道string实际上也是一个数组,表面上它是从1开始的,实际上不是,也是从0开始,只不过第0个被系统所用,用于保存数组的长度!我想这就是那个计数器了吧?而Pchar类型是根据最后一个为空字符的字符来决定数据的长度的,引用pchar类型的数据时,碰到空字符(在Delphi中用#0表示)就表示没有了。
我只知道string实际上也是一个数组,表面上它是从1开始的,实际上不是,也是从0开始,只不过第0个被系统所用,用于保存数组的长度!我想这就是那个计数器了吧?而Pchar类型是根据最后一个为空字符的字符来决定数据的长度的,引用pchar类型的数据时,碰到空字符(在Delphi中用#0表示)就表示没有了。
var
s:string;
begin
s:='hi'; x x x x | x x x x |'h'' i' #0
-8 -4 1 2 3 4...
引用计数 s的地址
物理地址。因此,复制字符串因为仅仅是复制了指针而不是复制实际的字符串而变得非常快。
string的内存基本上是wwwhym所说,(分配的大小||引用记数|长度|字符串)
当两个或更多的A n s i S t r i n g 类型共享一个指向相同物理地址的引用时,D e l p h i 内存管理使用了
c o p y - o n - w r i t e 技术,一个字符串要等到修改结束,才释放一个引用并分配一个物理字符串。下面的例
子显示了这些概念:
v a r
S 1 , S 2 : s t r i n g ;
b e g i n
/ /给S 1 赋值,S 1 的引用计数为1
S1:='And now for something...';
S2:=S1; //现在S 2 与S 1 指向同一个字符串,S 1 的引用计数为2
/ / S 2 现在改变了,所以它被复制到自己的物理空间,并且S 1 的引用计数减1
S2:=S2+'completely diff e r e n t 1 ' ;
e n d ;
分配的大小引用计数长度
我看了@s和@s[1]的值差得很远