string - 如何计算字符串变量使用的实际内存?

标签 string delphi memory

Delphi 中的字符串位于动态内存中。

如何计算 string 变量使用的实际内存(以字节为单位)?

我知道字符串必须存储一些额外的信息,至少是引用计数和长度,但是除了字符之外它使用了多少字节?

var
  S: string;

使用 Delphi 2010、XE、XE2

最佳答案

取自 Embarcadero 官方文档的 32 位 UNICODE DELPHI 的布局如下:

UNICODE DELPHI

请注意,在 64 位版本中有一个额外的 longint 字段,用于 16 字节对齐。 'system.pas' 中的 StrRec 记录如下所示:

StrRec = packed record
{$IF defined(CPUX64)}
  _Padding: LongInt; // Make 16 byte align for payload..
{$IFEND}
  codePage: Word;
  elemSize: Word;
  refCnt: Longint;
  length: Longint;
end;

有效载荷的大小始终为 2*(Length+1)。对于 32 位或 64 位目标,开销为 12 或 16 个字节。请注意,实际内存块可能比内存管理器确定的需要大。

最后,这个问题有很多错误信息。在 64 位目标上,字符串仍由 32 位有符号整数索引。

关于string - 如何计算字符串变量使用的实际内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10910631/

相关文章:

c++ - 尝试在 C++ 中使用动态数组推送值

c++ - 字符串作为参数 (C++)

Delphi:idHttp+SSL 从服务器获取 403 Forbidden

delphi - TVirtualStringTree 的 RootNode 的父级

java - Linux Java应用程序内存泄漏检测

ios - CATiledLayer 和 UIImageView 他们之间有什么大不了的?

java - 如何在Java中用不同的值替换字符串中多次出现的相同正则表达式模式

c# - ftp 网络请求中的输入字符串格式不正确

java - 字符串到 JComboBox 的转换

双显示器中的 Delphi XE Form 和 Source