这是 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 似乎需要这样做。