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

4
Cpp plus 1 24 Фев 2018 в 19:04

5 ответов

Лучший ответ

Зависит от типа приложения.

Как уже упоминалось, 32-разрядные платформы считаются устаревшими, а запуск 32-разрядных приложений на 64-разрядных платформах накладывает определенные накладные расходы. Кроме того, как вы упоминали, компилятору доступно больше регистров и более продвинутый набор команд.

OTOH существуют сценарии, в которых код, скомпилированный для 32-битных систем, имел бы значительное преимущество из-за меньшего размера собственных указателей.

Например, у меня есть приложение с «алгоритмическим» кодом, которое имеет дело с большим набором данных, хранящихся в сложных структурах данных с перекрестными указателями. То же приложение, скомпилированное для 32-битной платформы, занимает значительно меньше памяти и работает значительно быстрее.

Таким образом, если ваше приложение не приближается к 32-разрядному ограничению, оно работает со сложными структурами данных с собственными указателями, и производительность критична - 32-разрядное может быть подходящим вариантом. В противном случае я бы рекомендовал перейти на 64-разрядную версию.

2
valdo 24 Фев 2018 в 16:30

WoW64 на Intel 64 (AMD64 / x64) не требует эмуляции инструкций. В этом случае подсистема WoW64 эмулирует только 32-разрядную среду через дополнительный уровень между 32-разрядным приложением и 64-разрядным Windows API. В некоторых местах этот слой тонкий, в других - чуть толще. Для средней программы вы можете ожидать 2% снижения производительности из-за этого уровня. Для некоторых программ он может быть больше. Два процента не очень много, но имейте в виду, что 32-разрядные приложения работают немного медленнее в 64-разрядной Windows, чем в 32-разрядной среде.

Компиляция 64-битного кода не только позволяет избежать использования WoW64, но и дает дополнительный прирост производительности. Это объясняется архитектурными изменениями в микропроцессоре, такими как увеличение количества регистров общего назначения. Для средней программы можно ожидать увеличения производительности на 5-15% после одной только перекомпиляции.

Из-за слоя WoW64 32-битные программы менее эффективны в 64-битной среде, чем в собственной 32-битной. Тем не менее, простые 32-разрядные приложения могут по-прежнему получать одно преимущество от выполнения в 64-разрядной среде. Возможно, вы знаете, что программа, созданная с помощью переключателя "/ LARGEADDRESSAWARE: YES", может выделить до 3 Гбайт памяти, если 32-разрядная Windows запускается с переключателем "/ 3gb". Что ж, та же 32-разрядная программа, построенная на 64-разрядной системе, может выделить почти 4 ГБ памяти (на практике это обычно около 3,5 ГБ).

Постскриптум См. Также «Урок 2. Поддержка 32-разрядных приложений в 64-разрядной среде Windows » .

1
AndreyKarpov 24 Фев 2018 в 16:40

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

Я рекомендую 64 бит (AMD 64). У 32-битных (x86) приложений нет никаких преимуществ, кроме совместимости для действительно старых компьютеров. Я уверен, что кто-то более знающий, чем я, может указать некоторые технические преимущества AMD 64 по сравнению с x86, но я подозреваю, что они не будут иметь реального значения в вашем среднем приложении.

Но ничто не мешает вам компилировать и распространять оба.

0
bolov 24 Фев 2018 в 16:16

У вас есть корректное улучшение доступа к реестру в 64-битном режиме, но вы можете не знать, насколько значительна разница.

в Википедии:

Начиная с процессора AMD Opteron, архитектура x86 расширилась 32-битные регистры в 64-битные регистры аналогично тому, как Произошло расширение от 16 до 32 бит. R-префикс идентифицирует 64-битный регистры (RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP, RFLAGS, RIP) и восемь дополнительных 64-битных общих регистров (R8-R15) были также введено в создании x86-64. Однако эти расширения можно использовать только в 64-битном режиме ...

На x86 работа в 64-битном режиме дает вам доступ к 16 64-битным регистрам. В 32-битном режиме вы можете получить доступ только к 8 32-битным регистрам.

А поскольку в любом случае три из этих регистров - это программный счетчик, указатель стека и указатель кадра, разница в доступных регистрах общего назначения еще более существенна.

Таким образом, вы фактически переходите от пяти или шести 32-битных регистров к 13 или 14 64-битным регистрам, просто изменяя свой флаг компиляции с -m32 на -m64.

Если у вас нет особых потребностей для развертывания на более старых 32-разрядных аппаратных или операционных системах, на самом деле нет причин для компиляции 32-разрядных приложений x86.

Просто будьте осторожны при переносе кода на 64-битные. По-прежнему существует слишком много программистов, которые объединяют указатели и int и long.

1
Andrew Henle 24 Фев 2018 в 16:46

Используйте 64-битные, потому что запуск 32-битных в 64-битной среде имеет накладные расходы (хотя и небольшие).

1
Ctznkane525 24 Фев 2018 в 16:06