在DELPHI中如何得到一个STRING类型的变量在内存所占的空间大小?也即得到内存空间的长度?

解决方案 »

  1.   

    DELPHL中STRING类型DEFAULT为长字符串类型,该类型是一种动态数组,在使用前就可以手工用这样的语句来分配内存中占据的长度
    SetLength (字串变量,50);
    不然我想其他情况下它的内存长度就应该是
    Length (字串变量)
      

  2.   

    首先要看编译开关,默认可能是ShortString也可能是AnsiString如果是ShortString那默认就是256如果是var Str: String[10]这种方式声明的,那也ShortString,占用内存为10+1=11AnsiString就复杂了,不能用数组去理解它,SizeOf(String)得到的只能是指针长4字节看看System单元的_NewAnsiString可知道,它的长度应该是
    length + sizeof(StrRec) + 1 + ((length + 1) and 1)  StrRec = packed record
        refCnt: Longint;
        length: Longint;
      end;refCnt记录引用计数,length记录长度((length + 1) and 1)表示length为偶数就再加1查看_NewWideString可知如果是WideString把Length*2后调用_NewAnsiString
      

  3.   

    我这是以D6为例,早期版本的Delphi有所不同,可自行查看相关VCL
      

  4.   

    当然按照你的说法"变量所占内存大小",那就是长指针变量所占内存,那就等于4,上面分析的AnsiString为为指针指向地址空间所分配的内存大小Length(Str)获得的只是StrRec.length的取值
      

  5.   

    默认是AnsiString,长度可变,专门用一个Integer类型的整数记录长度,所以我想所占内存的字节数应该是Length(str:string)+4
      

  6.   

    呵呵,我上面说的不够清楚?你那样靠猜怎么能行?据我所知,没有任何一个版本的Delphi为String分配的内存为Length(str) + 4,而且计数不可能为负数,怎么可能用Integer?我看过的几个版本的VCL都是定义为Longint.
      

  7.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      s : string ;
      P : pointer ;
      i : integer ;
    begin
      s :='ABC';
      P := pointer(integer(@s[1])-8) ;
      caption := '';
      for i := 0 to 10 do
      begin
       caption := caption +' '+IntToHex(PByte(P)^,2);
        p:=pointer(integer(p)+1);
      end;
    end;運行結果為: 01 00 00 00 03 00 00 00 41 42 43
    $41,$42,$43,為'ABC'的鍵值也就是字串數據 也就是s[1],s[2],s[3]
    往前的s[0]s[-1]s[-2]s[-3]為四字節的整型值,是字串長度,也就是3
    再往前的s[-4],s[-5],s[-6],s[-7]為四字節的整型值,是引用計數!
    所以一個長字串所占的內存為Length(s)+8