Размер 64-разрядной DLL на 50% больше, чем 32-разрядная

У меня есть проект VС++ (2005), который генерирует как 32-разрядные, так и 64-разрядные DLL. 32-разрядная dll имеет 1044 КБ, а 64-разрядная версия - 1620 КБ. Мне любопытно, почему размер такой большой. Это просто из-за большего размера адреса или есть параметр компилятора, который мне не хватает?

Ответ 1

Возможно, ваш код содержит много указателей.

Свободный обед превышает

....

(В сторону: Здесь есть анекдот, демонстрирующий "пространство - это скорость", которая недавно ударила меня команда компилятора. Компилятор использует то же исходное основание для 32-битных и 64-битные компиляторы; код просто скомпилированный либо как 32-битный процесс, либо 64-битный. 64-разрядный компилятор получил много базовых производительность при работе на 64-битной CPU, главным образом потому, что 64-битный У процессора было много регистров для работы с и имела другую производительность кода функции. Все хорошо и хорошо. Но что о данных? Переход на 64 бита didnt изменить размер большинства данных в , кроме указателей курсора , в частности, были в два раза больше они были раньше. Как это происходит, наш компилятор использует указатели гораздо больше в своих внутренних данных , чем большинство других приложения никогда не будут.. указатели теперь были 8 байтами вместо 4 байт, увеличение чистого размера данных, мы наблюдалось значительное увеличение 64-разрядный рабочий набор компиляторов. Что больший рабочий набор вызвал что почти точно компенсировать выполнение кода увеличение производительности за счет переход на более быстрый процессор с больше регистров. На момент написания этой статьи, 64-битный компилятор работает на одном и том же как 32-битный компилятор, даже хотя исходная база такая же для оба и 64-битный процессор предлагают более высокая производительность обработки сырья. Пространство - это скорость.)

Ответ 2

x86-64 имеет больше регистров. В результате, opcodes нужно больше бит, чтобы указать их. Кроме того, по традиции x86 вы можете указать части регистра, и теперь у вас есть 32-битный частичный регистр. Инструкции, которые не используют регистры, редки, поэтому эти изменения затрагивают почти каждую инструкцию. Поскольку x86-64 по-прежнему является ISA с переменной длиной CISC, это не означает, что каждая инструкция выросла с 32 до 64 бит, но есть определенный рост.

Другое изменение заключается в том, что movq, код операции для установки регистра в константу требует 64-битных констант (но другие константы в кодах операций по-прежнему составляют 32 бита)

Ответ 3

Размер вашего указателя удваивается, поэтому, если у вас много указателей в коде, ваш исполняемый файл может легко вырасти на 50%.