Почему SetString занимает меньше памяти в Delphi (с Unicode)?

Это 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.

8
задан lkessler 5 October 2010 в 01:06
поделиться