zoukankan      html  css  js  c++  java
  • 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;

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

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

  • 相关阅读:
    Vue ui创建vue-cli 3.0项目
    Vue中封装axios
    微信小程序自定义顶部导航
    linux离线安装docker
    解决websocket不能@Autowired注入问题
    springboot 连接 Access数据库
    Flex 布局教程:语法篇
    通过代码来了解下java策略模式,消除if-else
    docker下安装FastDFS
    centos7下安装docker
  • 原文地址:https://www.cnblogs.com/dmqhjp/p/14790862.html
Copyright © 2011-2022 走看看