Подтвердить что ты не робот

По какой причине я бы выбрал настройку выравнивания файла компилятора С#, отличную от 512?

В MSDN я вижу, как изменить выравнивание файлов для компиляции С# (через настройки проекта и командную строку).

Я гуглил и видел статьи, объясняющие, что выравнивание файла 512 байт уменьшает размер .dll. Я проверил себя с различными выравниваниями файлов и увидел, что да, это так.

Мой вопрос:

Зачем мне когда-либо использовать другое выравнивание файлов? Должны быть сценарии, где это требуется, или не было бы выбора?

Кроме того, что это делает именно? Страницы MSDN говорят о разделах? Какие разделы?

http://msdn.microsoft.com/en-us/library/0s4tzdf2.aspx

4b9b3361

Ответ 1

Это довольно подробная техническая реализация. Для начала вам сначала нужно понять структуру файла PE32, формат файла для DLL и EXE в Windows. Каноническая статья для этого - Мэтт Пьетрик "Peering Inside the PE," Обзор файла исполняемого файла Win32 Portable ". Написано 17 лет назад, но все еще актуально и доступно.

Параметр/filealign ссылается на значение поля IMAGE_OPTIONAL_HEADER.FileAlignment. Он определяет, как исходные данные в секции выравниваются. Раздел представляет собой фрагмент кода или данных в файле. Почти исключительно данные в случае чистых .NET-сборок.

Между файловым форматом и диском существует очень тесная взаимосвязь. Исполняемое изображение используется в качестве файла резервной копии файла Mapped Memory в Windows. Исполняемые файлы загружаются путем сопоставления файла в адресное пространство виртуальной памяти. Очень эффективная загрузка DLL связана только с созданием этого сопоставления, никакие фактические данные не считываются из файла. Это происходит ленивым способом, когда процесс пытается прочитать байт из раздела. Если он еще не загружен в память, это вызывает ошибку страницы, и операционная система считывает 4096 байт из файла в память. Большим преимуществом является то, что вы не платите за данные или код, который вы не используете. Также причина, по которой чтение [атрибутов] является дорогостоящим, когда вы читаете его в первый раз.

Актуальность выравнивания файлов заключается в том, как выводятся исходные данные в разделах. Большинство современных исполняемых файлов, содержащих машинный код, используют выравнивание 4096 байт, размер страницы виртуальной памяти. Это не очень важно для сборок, содержащих управляемый код, IL - это просто данные. Который имел бы смысл использовать меньшее выравнивание, которое тратило меньше места. 512 байтов (не килобайт) - это счастливое число, это наименьшее значение, допустимое в формате PE32.

Единственная возможная причина, по которой я могу думать о добавлении опции в пользовательский интерфейс, заключается в том, что у компилятора С# очень мало параметров компиляции по сравнению с другими компиляторами. "Другое" - это компиляторы, которые генерируют собственный код. Таким образом, опция есть, потому что у компилятора есть опция. Многие трюки покрываются [атрибутами], что делает командную строку компилятора коротким и быстрым. Но нет атрибута для выравнивания файлов, он должен быть известен до генерации файла, атрибут будет слишком поздним.

Простым примером является компилятор и компоновщик С++, IDE предлагает девятнадцать страниц свойств для их установки. Но все еще не покрывая их всех, действительно непонятные должны быть установлены на странице "Командная строка".