Object Pascal中String类型的内幕探讨[4]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 weizhisheng 的 blog

  psz := pchar(s);

  pdw := pdword(psz);

  dec(pdw);dec(pdw);dec(pdw);

  dw1 := pdw^;

  inc(pdw); dw2 := pdw^;

  inc(pdw); dw3 := pdw^;

  listbox1.items.add( format('[after cow]size:%d, ref:%d, len:%d',

                        [dw1,dw2,dw3]) );

end;

 

 

procedure tform1.button3click(sender: tobject);

begin

  listbox1.items.clear;

end;

 

如果你对指针的概念比较清楚的话,上面的代码是不难理解的。下面是该程序的输出结果:

[current]size:22, ref:5, len:5

[before assign]size:22, ref:2, len:5

[after assign]size:22, ref:3, len:5

[after cow]size:22, ref:2, len:5

 

观察上述结果,可以得出几个结论:

1.“分配大小”和“字串长度”之间存在着一种固定的数量关系,即分配大小=字串长度+17。为什么会有这种关系?请你再看一看string类型的内存分布:(4字节)分配大小+(4字节)引用计数+(4字节)字串长度+(不定长)字符数组+(1字节)$0结束字符,4+4+4+(strlen)+1,应该是13+(strlen)才对,也就是说应该还有4字节的空间,其用途尚不清楚。值得一提的是,如果你将字符串清空,那么len的结果可能不是你所想象的0,而是一个让你大吃一惊的数字。

本文关键:Delphi,Object Pascal
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top