gpt4 book ai didi

delphi - 为什么 SetString 在 Delphi 中占用更少的内存(使用 Unicode)?

转载 作者:行者123 更新时间:2023-12-03 14:46:29 24 4
gpt4 key购买 nike

这是 Delphi 2009,因此适用 Unicode。

我有一些代码将字符串从缓冲区加载到 StringList 中,如下所示:

      var Buffer: TBytes; RecStart, RecEnd: PChar; S: string;

FileStream.Read(Buffer[0], Size);

repeat
... find next record RecStart and RecEnd that point into the buffer;

SetString(S, RecStart, RecEnd - RecStart);
MyStringList.Add(S);
until end of buffer

但是在一些修改过程中,我改变了我的逻辑,以便最终添加相同的记录,但作为单独派生的字符串而不是通过 SetString,即

      var SRecord: string;

repeat
SRecord := '';
repeat
SRecord := SRecord + ... processed line from the buffer;
until end of record in the buffer

MyStringList.Add(SRecord);
until end of buffer

我注意到 StringList 的内存使用量从 52 MB 增加到大约 70 MB。增幅超过 30%。

为了恢复较低的内存使用量,我发现我必须使用 SetString 创建字符串变量以添加到我的 StringList 中,如下所示:

      repeat
SRecord := '';
repeat
SRecord := SRecord + ... processed line from the buffer;
until end of record in the buffer

SetString(S, PChar(SRecord), length(SRecord));
MyStringList.Add(S);
until end of buffer

检查并比较 S 和 SRecord,它们在所有情况下都完全相同。但是将 SRecord 添加到 MyStringList 比添加 S 使用更多的内存。

有人知道发生了什么以及为什么 SetString 可以节省内存吗?

<小时/>

后续。我没想到会这样,但我检查了一下以确定。

两者都不是:

  SetLength(SRecord, length(SRecord));

也不

  Trim(SRecord);

释放多余的空间。 SetString 似乎需要这样做。

最佳答案

如果您连接字符串,内存管理器将分配更多内存,因为它假定您向其中添加越来越多的文本,并为将来的连接分配额外的空间。这样,字符串的分配大小远大于使用的大小(取决于使用的内存管理器)。如果使用SetString,新字符串的分配大小几乎与已使用的大小相同。当SRecord字符串超出范围并且其引用计数变为零时,SRecord占用的内存被释放。因此,您最终会获得字符串所需的最小分配大小。

关于delphi - 为什么 SetString 在 Delphi 中占用更少的内存(使用 Unicode)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3795138/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com