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

chen_yj 2003-08-20 10:15:29
在DELPHI中如何得到一个STRING类型的变量在内存所占的空间大小?也即得到内存空间的长度?
...全文
362 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ehom 2003-08-21
  • 打赏
  • 举报
回复
呵呵,我上面说的不够清楚?

你那样靠猜怎么能行?据我所知,没有任何一个版本的Delphi为String分配的内存为Length(str) + 4,而且计数不可能为负数,怎么可能用Integer?我看过的几个版本的VCL都是定义为Longint.
cxz7531 2003-08-21
  • 打赏
  • 举报
回复
默认是AnsiString,长度可变,专门用一个Integer类型的整数记录长度,所以我想所占内存的字节数应该是Length(str:string)+4
ehom 2003-08-21
  • 打赏
  • 举报
回复
当然按照你的说法"变量所占内存大小",那就是长指针变量所占内存,那就等于4,上面分析的AnsiString为为指针指向地址空间所分配的内存大小

Length(Str)获得的只是StrRec.length的取值
Hewin 2003-08-21
  • 打赏
  • 举报
回复
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




Sumie@Sam 2003-08-21
  • 打赏
  • 举报
回复
sizeof(string)=4
ehom 2003-08-20
  • 打赏
  • 举报
回复
我这是以D6为例,早期版本的Delphi有所不同,可自行查看相关VCL
ehom 2003-08-20
  • 打赏
  • 举报
回复
首先要看编译开关,默认可能是ShortString也可能是AnsiString

如果是ShortString那默认就是256

如果是var Str: String[10]这种方式声明的,那也ShortString,占用内存为10+1=11

AnsiString就复杂了,不能用数组去理解它,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
bluecyclone 2003-08-20
  • 打赏
  • 举报
回复
sizeof(String);
lxl 2003-08-20
  • 打赏
  • 举报
回复
DELPHL中STRING类型DEFAULT为长字符串类型,该类型是一种动态数组,在使用前就可以手工用这样的语句来分配内存中占据的长度
SetLength (字串变量,50);
不然我想其他情况下它的内存长度就应该是
Length (字串变量)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧