Это 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 МБ дооколо 70 МБ.Это было увеличение более чем на 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 экономит память?
Followup.Я не думал, что это произойдет, но я проверил, чтобы убедиться.
Ни:
SetLength(SRecord, length(SRecord));
, ни
Trim(SRecord);
освобождает лишнее пространствоКажется, для этого требуется SetString.