2.因为分配大小和字串长度都是用4字节来表示的,而且string类型是动态分配内存,所以字符串最大可能的长度应该是2^32-17个字节。
3.在拷贝字符串的时候,object pascal并不是把字符串简单的复制一份,而是采取了引用计数的方法,将两个字符串指向同一个内存空间,同时引用计数加1。当字符串变量被清除的时候,引用计数减1,如果引用计数已经减为0,表明该字符串可以真正被清除了。显然,这种方法比复制整个字符串的效率要高。
4.在给字符串赋值的时候,object pascal首先会检查字符串的引用计数是否为1。如果是,按照一般的方法直接赋值即可;否则,就说明有两个以上字符串指向同一个地址,这种情况就复杂多了。object pascal使用的是copy-on-write机制(cow),为当前字符串另外开辟一个缓冲区,将新内容拷入;同时,原来的字符串引用计数要减一。
5.知道了string的内存布局,我们也就知道了pchar(str)的意义了。不过,使用pchar的同时也就丢失了string的动态增长和引用计数的功能,所以一定要小心,另外要注意pchar长度的计算和字符串长度一定要同步,否则会出问题。比如,下面的代码就不能正常工作:
var
str : string;
begin
setlength(str,256);
getwindowdirectory(pchar(str),256);
str := str + ‘\win.ini’;
end;
这样的结果是不正确的。之所以不正确,是因为setlength将字符串长度设成了256,而pchar计算的长度只到第一个$0为止。正确的方法应该是:
setlength(str,256);
getwindowsdirectory(pchar(str),256);
setlength(str,strlen(pchar(str)));
str := setr + ‘\win.ini’;