我来说几句,首先我觉得,lich对字符串的解释很有道理的
现在来说说kp1150认为的:在读字符串的某个地址的时候不引起copy-on-write操作,而只是在改变了字符串中某个字符的时候才引起copy-on-write。
假设kp1150说的是对的,那么我们设想这么一个场景
var
s, s1, s2, s3,s4: String;
p: PChar;
begin
s := '12345';
s1 := s
s2 := s
s3 := s
s4 := s
//这个时候,内存中只有一份字符串
p := @s1[2];//假设这句没有引起copy-on-write
//按照我的意思,我仅仅是要改变s2的第2个字符为a
p^ := 'a'
//执行到这句,应该引起copy-on-write了吧,再确切点说,s2应该被独立出来了吧
//但是问题出来了,如何知道这个p来自s2而不是s,s3,s4呢?
//或许你会说,因为p=@s1[2];这个付值,只要记录这个付值操作就行了,那是不是说PChar类型或者其它的指针类型需要记录我的这个指针来自哪里呢?这样的记录,开销可就太大了
end;
所以说,最保险的做法,就是在p := @s1[2];这句的时候,就先复制出来一个s2的副本,然后再把s2[2]的地址给p,这样,以后就不用管你拿着p到点干了什么事情了