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