На что обратить внимание при написании 32-битного программного обеспечения на 64-битной машине?

Я покупаю удобный ноутбук для разработки, но единственная доступная мне операционная система - 64-битная (Win7), теперь я в основном знаю, что 64-битная имеет 8-байтовые целые числа и может использовать больше оперативной памяти, вот и все.

Мое программирование будет отличаться (С++, иногда PHP), но хотелось бы знать:

  • Могу ли я создать 32-разрядное переносимое приложение на C++ (запускать на 32-разрядном компьютере без необходимости сборки под 32-разрядной виртуальной машиной?)
  • На какие простые ошибки следует обратить внимание при написании приложения (кастинг и т. д.)

person John    schedule 15.09.2010    source источник


Ответы (4)


Процессоры были 64-битными в течение некоторого времени. Я недоумеваю, почему люди боятся переходить на 64-битную операционную систему. 32-битная ОС не может адресовать больше 3 Гб ОЗУ, так что это достаточная причина, чтобы сделать обновление в моей книге!

Когда вы кодируете, самая большая разница, с которой я столкнулся, — это размер указателя!

В 32-битной скомпилированной программе указатель обычно имеет размер 4 байта. В 64-битной скомпилированной программе указатель обычно имеет размер 8 байт.

Почему это важно?

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

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

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

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

Таким образом, вы можете подумать, что передача значений указателя была бы необычной практикой, но самый простой способ передачи структуры — это запоминание ее содержимого через сокет, указатели и все такое!

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

person Community    schedule 16.09.2010
comment
Я рад, что это так просто, я обязательно подключу виртуальную машину и проведу некоторое тестирование между двумя арками, чтобы увидеть, удобно ли вводить код с различиями, и я уверен, что это будет так! - person John; 16.09.2010
comment
@Джон Это не так просто. Например, на 32-битной машине максимальное целочисленное значение намного ниже, чем на 64-битной машине. Это часто вызывает проблемы с отладкой. - person OTZ; 17.09.2010
comment
Простой пример программы докажет обратное OTZ. Напишите простую программу, которая выводит sizeof(int), а затем скомпилируйте ее для 32-битной и 64-битной архитектуры. Это скажет вам разницу. Вы обнаружите, что они оба одинаковы. Единственная разница в двух архитектурах — это размеры указателя. - person ; 18.09.2010
comment
@user, это зависит от того, какую 64-битную модель данных вы используете. с использованием. Основные из них имеют 32-битные целые числа, но не все. - person Matthew Flaschen; 20.06.2012

Проще всего было бы просто создать 32-битный исполняемый файл. В Visual Studio просто выберите Win32 в качестве типа сборки. В gcc используйте переключатель -m32.

person Mark Wilkins    schedule 15.09.2010
comment
кроме того, до VS 2008 нет предопределенных настроек Win64. Вы должны настроить его вручную. 32 бита это нормально. - person dyp; 16.09.2010

Специально для Windows взгляните на документацию msdn WOW64. . 64-разрядная версия Windows запускает 32-разрядные приложения в эмуляторе, поэтому вы можете создавать 32-разрядные приложения для своей системы. Это оказывает некоторое (довольно положительное) влияние на ваше приложение, например. виртуальное адресное пространство для вашего процесса увеличивается, поскольку ОС может использовать более высокие 64-битные адреса, о которых ваш 32-битный процесс даже не подозревает.

Размеры типов данных MSVC++ также задокументированы в MSDN. Но если вы беспокоитесь о приведении, вам следует использовать более крупные типы, которые, безусловно, будут соответствовать вашим потребностям. Стандарт C++ не определяет точный размер типов (афаик), а только их относительные размеры (short короче, чем int и т. д.). Таким образом, вы не можете полагаться на точный размер этих типов, если только вы не используете int32 или __int32, которые, очевидно, не изменятся для 64-битных приложений.

person dyp    schedule 15.09.2010

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

В случае компилятора Microsoft это должно быть так же просто, как запустить Visual Studio и скомпилировать вашу программу с использованием конфигурации Win32 по умолчанию. Если вы предпочитаете командную строку, обязательно выберите 32-разрядные инструменты, вызвав команду Visual Studio. Подскажите (в отличие от x64 версии).

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

person Atul    schedule 16.09.2010