Какое влияние (если есть) переход Delphi 2009 на Unicode (/ UTF16) оказывает на размер исполняемого файла и объем памяти?

Вот один из раздела "Никаких вопросов не слишком глупо":

Ну как говорит сабж: есть ли удар? Если да, то сколько? Будут ли теперь все строковые литералы в моем коде и в моих ресурсах DFM занимать вдвое больше места внутри скомпилированных двоичных файлов? Как насчет использования памяти времени выполнения скомпилированными приложениями? Все ли строковые переменные теперь будут занимать вдвое больше оперативной памяти? Стоит ли мне вообще беспокоиться?

Я помню, как что-то подобное мне задавали во время одной из ранних предварительных веб-трансляций, но я не могу вспомнить ответ. И поскольку пробная версия составляет всего 14 дней, я не собираюсь просто пробовать ее, пока не обновят нужные мне сторонние библиотеки (предположительно, примерно через месяц).

Строковые литералы, используемые в коде, будут интерпретироваться в контексте, в котором они фактически используются, и затем будут соответствующим образом закодированы в исполняемые данные. Другими словами, если у вас есть строковый литерал, назначенный для AnsiString, он будет закодирован как Ansi. Если у вас есть литерал, назначенный UTF8String, он будет закодирован как UTF-8. Если у вас есть литерал, назначенный UnicodeString, он будет закодирован как UTF-16.

Remy Lebeau 06.06.2009 01:51

DFM поддерживает UTF-8 уже много лет. Строки Unicode могут быть закодированы как UTF-8 или UTF-16.

Remy Lebeau 06.06.2009 01:51

Переменные UnicodeString во время выполнения будут занимать в два раза больше оперативной памяти во время выполнения, да. AnsiString, UTF8String и другие переменные на основе Ansi не будут.

Remy Lebeau 06.06.2009 01:51

Реми, почему бы вместо этого не опубликовать эти комментарии в качестве ответа?

Oliver Giesen 07.06.2009 19:52
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
1 276
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я не использовал Delphi много лет, но это, вероятно, зависит от того, какую кодировку Unicode они используют. UTF8 будет точно таким же для обычного набора символов ASCII (он использует только более одного байта, когда вы переходите к экзотическим символам). UTF16 может быть немного раздутым.

UTF-16 обычно меньше для языков, не основанных на латыни.

Barry Kelly 17.09.2008 17:16
Ответ принят как подходящий

D2009 использует UTF-16 в качестве строкового типа по умолчанию, хотя при необходимости вы можете сделать переменные UTF-8.

Ян Гойвертс обсуждает компромисс между размером и скоростью в хорошем сообщении в блоге.

Строковые литералы в DFM используются в кодировке UTF-8 по крайней мере с D7. Следовательно, не будет увеличения размера из-за строк в DFM с D2009.

Я слишком много лет ждал Unicode VCL, наконец, мы его видим. Я не думаю, что большинству приложений нужно беспокоиться о размерах, поскольку у них в любом случае не так много строковых литералов или они хранят огромные объемы данных в памяти.

Вопросы удобства использования более важны, чтобы максимально оправдать использование Unicode.

Если какой-то разработчик хочет создать крошечных бывших, они могут вручную оптимизировать с помощью AnsiString (если i18n не является проблемой).

Я наконец-то получил в свои руки Delphi 2009, и после внесения необходимых корректировок мой проект теперь компилируется и работает нормально. :)

Чтобы быстро получить результаты, мне сначала пришлось закомментировать один немного более сложный модуль приложения, поэтому он еще не сопоставим на 100%, но уже кажется достаточно безопасным, чтобы предсказать это, несмотря на значительное количество строковых литералов в нашем исходном коде (чрезмерное количество сообщений журнала отладки ) размер двоичного файла, скомпилированного с помощью Delphi 2009, вероятно, будет примерно таким же, как и раньше, если не меньше!

Интересно, действительно ли компилятор Delphi выполняет какое-либо сжатие двоичных файлов или, по крайней мере, его разделов ресурсов? Я действительно ожидал, что изменение строковых литералов UTF-16 окажет большее влияние на это конкретное приложение. Действительно ли литералы хранятся внутри двоичного файла как (несжатый) UTF-16?

У меня еще не было времени исследовать различия в объеме памяти.

Обновлено: Не напрямую связан с Unicode, но определенно связан: Андреас Хаусладен недавно опубликовал интересную информацию о (значительном) влиянии параметра компилятора {$STRINGCHECKS} (BTW: включено по умолчанию) на размер скомпилированного исполняемого файла: http://andy.jgknet.de/blog/?p=487

Нет, он не сжимает двоичные файлы или их ресурсы. Для этого вы должны использовать внешний сторонний компрессор, например UPX. Строковые литералы, присвоенные переменным UnicodeString в коде, будут храниться как UTF-16 (и как UTF-8 при назначении переменных UTF8String, Ansi при назначении переменных AnsiString и т. д.).

Remy Lebeau 06.06.2009 01:53

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