Блог пользователя ruban

Автор ruban, 10 лет назад, По-русски

Столкнулся со следующей неприятной особенностью Delphi — долгое посимвольное прибавление к строке символов из другой строки. Решение на Delphi задачи C с последнего контеста получает Time Limit, а оно же на FPC без малейших изменений работает 0.7 сек. Кто пояснит, почему оно так?? Ранее сталкивался, что очень долго (почти в 10 раз дольше, чем в FPC) работает деление int64, как мне объяснили, из-за корявого переделывания деления с 32-битного на 64-битное. А здесь в чем дело??

  • Проголосовать: нравится
  • +16
  • Проголосовать: не нравится

»
10 лет назад, # |
Rev. 2   Проголосовать: нравится +4 Проголосовать: не нравится

Используемые по умолчанию типы строк в FPC и Delphi различаются.

The type String may refer to ShortString or AnsiString, depending from the {$H} switch. If the switch is off ({$H-}) then any string declaration will define a ShortString.

http://wiki.freepascal.org/Character_and_string_types#String

By default, the use of ansistrings is off, corresponding to {$H-}.

http://www.freepascal.org/docs-html/prog/progsu25.html

В результате конкатенация строк в FPC сводится к дешёвому копированию области памяти и обновлению поля длины строки. Выделения памяти при этом не происходит, она выделяется единожды при входе в процедуру/метод/главный begin...end программы.

В современных версиях Delphi же в качестве строкового типа String используется либо AnsiString либо UnicodeString. Эти типы, в отличии от ShortString, выделяют под хранение строки ровно столько памяти, сколько нужно для текущего значения.

Это приводит к тому, что при конкатенации строк происходит выделение нового региона памяти достаточного размера и копирования во вновь выделенный регион значений конкатенируемых строк. Отсюда закономерное замедление.

Для быстрой конкатенации строк в Delphi есть класс TStringBuilder.