Delphi中String引用计数长度与占用内存

----------D7下

--String和Shortstring不一样!!!

vstr:string;

vShort:Shortstring;

vstr[0]这样写错误!;//vstr[1]才是第一个字符

vShort[0]这样写没问题!//vShort[0]保存的是vShort的长度:byte(vShort[0]);

-------------先说String------

var
vStr:string;

procedure TForm1.Button2Click(Sender: TObject);
begin
vStr:='555';//vStr不能放在这个procedure中声明,否则,下面的不准确,为啥不准确,俺也说不出所以然,vStr这个不要定义为局部变量;说了两遍了
Memo1.Clear;
Memo1.Lines.Add('地址:'+IntToStr(Integer(vStr)));
Memo1.Lines.Add('长度:'+IntToStr(pinteger(Integer(vStr)-4)^));
Memo1.Lines.Add('引用次数:'+IntToStr(pinteger(Integer(vStr)-8)^));
Memo1.Lines.Add('占用字节数:'+IntToStr(pinteger(Integer(vStr)-12)^));
end;

----------------------------String结束

------------------ShortString开始---------

资料参考:更深入的理解delphi7里的ShortString类型_honglei520的博客-CSDN博客  https://blog.csdn.net/honglei520/article/details/44588125

ShortString 是一种比较古老的 Pascal 字符串格式,它最多只能容纳  255  个字节的字符。当我们声明一个 ShortString 类型的变量时,Delphi 会自动申请  256  个字节的内存空间给该变量,其中第一个字节用来存放字符串的长度,后面的  255  个字节用来存放字符串内容,如果字符串的长度不够  255  个字节,则有多少字符就用多少内存,后面未用到的内存清零。  
————————————————
版权声明:本文为CSDN博主「honglei520」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/honglei520/article/details/44588125

procedure TForm1.Button3Click(Sender: TObject);
var
vShort:ShortString;
begin
vshort:='空间和科技';
ShowMessage('vShort的长度:'+IntToStr(byte(vShort[0])));
end;

---------------------ShortString结束----------------------

------------------------ShortString的字符串的长度不够  255  个字节,则有多少字符就用多少内存,后面未用到的内存清零---------存在质疑!!-----开始--

procedure TForm1.Button1Click(Sender: TObject);
type
TTT=array[0..255] of Char;
var
vShort:ShortString;//感觉这个本身就占用256字节
arraystr:TTT;
i:Integer;
begin
ShowMessage(IntToStr(SizeOf(vShort))); //{256}//这个变量占256个字节
for i:=0 to 255 do
begin
arraystr[i]:=#0;//把数组全部置位#0,方便下面测试是查看arraystr的内容
end;
vshort:='空间和科技0';
ShowMessage('vShort的长度:'+IntToStr(byte(vShort[0])));
arraystr:=TTT(vshort);//下断点看到arraystr的内容和这句(则有多少字符就用多少内存,后面未用到的内存清零)不符, 未用到的内存没有清零,依然占用了
end;

-----------------------ShortString的字符串的长度不够  255  个字节,则有多少字符就用多少内存,后面未用到的内存清零---------存在质疑!!------结束-------------

--------------------------------动态数组和String类型类似,也有引用之说----------------

var

vArray:array of integer;

begin
//动态数组和String类似
Finalize(varray);
//varray:=nil;
//SetLength(varray,0) //三种释放
SetLength(varray,20);

Memo1.Clear;
Memo1.Lines.Add('地址:'+IntToStr(Integer(varray)));
Memo1.Lines.Add('长度:'+IntToStr(pinteger(Integer(varray)-4)^));
Memo1.Lines.Add('引用次数:'+IntToStr(pinteger(Integer(varray)-8)^));
Memo1.Lines.Add('占用字节数:'+IntToStr(pinteger(Integer(varray)-12)^));
end;

这里说的是动态数组!静态数组没有这样的说法

--------------------------------------------动态数组  结束-------

原文地址:https://www.cnblogs.com/dmqhjp/p/14790862.html