Delphi, проблема использования строковой и широкой строковой памяти, VCL без Юникода (D7)

StackOverflow https://stackoverflow.com/questions/1992944

Вопрос

Я храню некоторые классы с описывающими их параметрами WideString (например, имя, описание и некоторые другие).Теперь, если я изменю все эти WideStrings на простую «строку» (на самом деле я использую псевдоним, поэтому мне нужно изменить только одну строку), использование памяти увеличится примерно на 5%!чем раньше...Как это возможно, если каждый символ строки в два раза меньше, чем WideChar?

заранее спасибо!

м.

Это было полезно?

Решение

Менеджер памяти Delphi не освобождает всю неиспользуемую память операционной системе.Фрагментация также может иметь очень серьезные последствия.Оба зависят от фактического используемого вами менеджера памяти (FastMM обычно лучше, чем стандартный менеджер памяти в D7, но любой менеджер памяти можно поставить на колени, используя специальную серию шаблонов использования памяти менеджера памяти).Более того, WideStrings, хотя и являются COM-строками, не учитывают ссылки и могут не выпускаться даже позже, чем обычные строки.

Единственный надежный способ запросить фактическое сообщение памяти в Delphi — это обратиться к диспетчеру памяти, который использует ваша программа Delphi.Эта функция в системном блоке сделает это за вас:

function GetHeapStatus: THeapStatus

--джероен

редактировать:20100104 в ответ на комментарий Марко:(FastMM обычно лучше, чем стандартный менеджер памяти в D7, но любой менеджер памяти можно поставить на колени, используя специальную серию шаблонов использования памяти диспетчера памяти)

Другие советы

Это возможно, потому что эти строки почти наверняка составляют (относительно) небольшую часть памяти, используемой для запуска вашей программы.Остальное пространство используется ручками, различными предметами и т.п.

Для примера предположим, что при использовании строк ANSI у вас есть около 100 КБ текста, и вместо этого вы конвертируете его в Widestrings.Будут затронуты только эти 100 КБ, но эти 100 КБ не составляют каждый байт памяти вашей программы.Пространство будет использоваться для форм, дескрипторов, чисел и других объектов, но поскольку они не изменяются при преобразовании, им, очевидно, не потребуется больше памяти, чем до преобразования.

WideStrings использует другой менеджер памяти (Windows), а затем AnsiStrings (Delphi), и подсчет ссылок у них разный.Как вы измеряли использование памяти?Каким инструментом и каким именно счетчиком?

Как вы измеряете использованную память?Память IIRC WideString выделяется с помощью SysAllocString() и тем самым обходит диспетчер памяти Delphi.

Менеджер памяти в Delphi всегда занимает больше памяти, чем ему действительно нужно.Это такое улучшение скорости.

Используете ли вы тип AnsiString или ShortString, когда не используете WideString?Возможно ли, что вы компилируете с флагом компилятора {$H–} (глобально или в каком-то модуле), который обрабатывает все типы «String» как ShortString?Если ваши строки имеют тип ShortString и вы не указываете размер строки, то выделяемая память всегда равна 256 байтам.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top