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