Сколько места занимают строковые константы в скомпилированной DLL? - PullRequest
6 голосов
/ 26 октября 2011

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

Сколько памяти занимает скомпилированная константа в скомпилированной DLL? Я предполагаю, что он хранится в виде UNICODE UTF-16 массива символов, и поэтому будет 2 байта на символ? Это правильно? Есть ли эмпирическое правило (или более строгое правило для расчета того, сколько сжатия можно выполнить для строки для сжатия zip, используемого для создания окончательного файла .xap?

РЕДАКТИРОВАТЬ Ясно, что возникла путаница из-за того, как я задал этот вопрос. Я говорю не о «объеме памяти» как о «объеме памяти, потребляемой приложением», а о размере «dll» и, следовательно, создаваемого xap-файла.

Ответы [ 3 ]

4 голосов
/ 26 октября 2011

Скажем так: System.Char (char в c #) в .NET - 2 байта. Он не может представлять все символы Unicode. Только символы BMP (базовая многоязычная плоскость) могут быть представлены одним Char. Остальные разбиты на суррогатные пары и нуждаются в 2х Char. В 99% случаев вы никогда не будете использовать персонажей за пределами BMP. http://en.wikipedia.org/wiki/UTF-16

Теперь ... String s в .NET состоит из System.Char (с символом NUL в конце), так что это "обычно" 2 байта на символ BMP (плюс еще 2 символа для терминатор).

В сборке строки сохраняются как UTF-16. Я только что проверил с помощью шестнадцатеричного редактора. Они не «полностью» NUL заканчиваются (у них один байт в 0), но их длина (в байтах) + 1 (для одного байта в 0) добавляется как 16-битное значение.

3 голосов
/ 26 октября 2011

уменьшить объем памяти [...]. Наиболее очевидный способ сделать это - избавиться от некоторых моих постоянных строк (например, строк ошибок) с целью извлечения их из сервера по требованию.

Объем памяти не зависит от размера исполняемого файла.У меня может быть исполняемый файл из нескольких K, который заполнит все ваши выступления оперативной памяти.

Как вы думаете, создание сокета, запрос строки через некоторый протокол, такой как HTTP, заполнение массива только необходимыми строками не будетВы потребляете по крайней мере столько же памяти, сколько просто массив строк, которые компилируются в ваш исполняемый файл?

Если что, вам следует искать в условной компиляции (#if ENGLISH // language specific variables here #endif) и, таким образом, включать только те строки, которые вы собираетесь использоватьнужно, или используйте один из многих вариантов интернационализации, таких как culture .

0 голосов
/ 26 октября 2011

Если я правильно помню, UTF-8 обратно совместим с ASCII, то есть для большинства распространенных символов это будет 1 байт на символ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...