And*_*rew 17 memory delphi string
Delphi中的字符串位于动态内存中.
如何计算string变量使用的实际内存(以字节为单位)?
我知道字符串必须存储一些额外的信息,至少是引用计数和长度,但除了字符之外它还使用了多少字节?
var
S: string;
Run Code Online (Sandbox Code Playgroud)
Delphi 2010,XE,XE2使用
opc*_*0de 15
从官方Embarcadero文档中获取的32位UNICODE DELPHI的布局如下:

请注意,64位版本中还有一个额外的longint字段用于16字节对齐.StrRec'system.pas'中的记录如下所示:
StrRec = packed record
{$IF defined(CPUX64)}
_Padding: LongInt; // Make 16 byte align for payload..
{$IFEND}
codePage: Word;
elemSize: Word;
refCnt: Longint;
length: Longint;
end;
Run Code Online (Sandbox Code Playgroud)
有效载荷的大小始终为2*(长度+ 1).对于32或64位目标,开销为12或16字节.注意,实际存储器块可能比存储器管理器确定的大.
最后,这个问题有很多错误的信息.在64位目标上,字符串仍然由32位有符号整数索引.
为String具体地,可以使用SysUtils.ByteLength()获得的字符数据的字节长度,并且如果然后不为零递增由所述结果SizeOf(System.StrRec)(这是在字符数据的前面的报头)和SizeOf(Char)(对于未包含在空终止长度),例如:
var
S: string;
len: Integer;
begin
S := ...;
len := ByteLength(s);
if len > 0 then Inc(len, SizeOf(StrRec) + SizeOf(Char));
end;
Run Code Online (Sandbox Code Playgroud)
另一方面,如果要计算其他字符串类型的字节大小,例如AnsiString,AnsiString(N)(例如UTF8String)RawByteString等,则需要使用System.StringElementSize(),例如:
var
S: SomeStringType;
len: Integer;
begin
S := ...;
len := Length(S) * StringElementSize(S);
if len > 0 then Inc(len, SizeOf(StrRec) + StringElementSize(s));
end;
Run Code Online (Sandbox Code Playgroud)
在任何一种情况下,如果字符串中包含字符,你只增加长度的原因是因为空字符串根本不占用任何内存,它们是nil指针.
| 归档时间: |
|
| 查看次数: |
3444 次 |
| 最近记录: |