На что обратить внимание при написании 32-битного программного обеспечения на 64-битной машине?
Автор вопроса: JohnОтветов: 4
Я покупаю удобный ноутбук для разработки, но единственная доступная мне операционная система - 64-битная (Win7), теперь я в основном знаю, что 64-битная имеет 8-байтовые целые числа и может использовать больше оперативной памяти, вот и все.
Мое программирование будет отличаться (С++, иногда PHP), но хотелось бы знать:
Могу ли я создать 32-разрядное переносимое приложение на C++ (запускать на 32-разрядном компьютере без необходимости сборки под 32-разрядной виртуальной машиной?)
На какие простые ошибки следует обратить внимание при написании приложения (кастинг и т. д.)
Процессоры были 64-битными в течение некоторого времени. Я недоумеваю, почему люди боятся переходить на 64-битную операционную систему. 32-битная ОС не может адресовать больше 3 Гб ОЗУ, так что это достаточная причина, чтобы сделать обновление в моей книге!
Когда вы кодируете, самая большая разница, с которой я столкнулся, - это размер указателя!
В 32-битной скомпилированной программе указатель обычно имеет размер 4 байта. В 64-битной скомпилированной программе указатель обычно имеет размер 8 байт.
Почему это важно?
Допустим, ваша программа использует сокеты для передачи структуры данных от одного процесса к другому. Возможно, серверный процесс 32-битный, а клиентский процесс 64-битный.
Хотя структура может быть определена одинаково как в 32-, так и в 64-разрядных программах, 64-разрядный исполняемый файл будет резервировать 8 байтов для каждого указателя (и структуры обычно содержат указатели на другие структуры, такие как связанные списки и т. д.).
Это может привести к смещению данных, когда 32-разрядный исполняемый файл передает структуру 64-разрядному исполняемому файлу.
В (почти?) всех случаях передача значений указателя между процессами в любом случае бессмысленна, например. их данные не имеют значения и могут быть опущены.
Таким образом, вы можете подумать, что передача значений указателя была бы необычной практикой, но самый простой способ передачи структуры - это запоминание ее содержимого через сокет, указатели и все такое!
Это самая существенная загвоздка, которую я обнаружил до сих пор при кодировании 64-битных клиентов, когда наше серверное программное обеспечение является 32-битным.
Ответ 2 · рейтинг 2 · Mark Wilkins
Проще всего было бы просто создать 32-битный исполняемый файл. В Visual Studio просто выберите Win32 в качестве типа сборки. В gcc используйте переключатель -m32.
Размеры типов данных MSVC++ также задокументированы в MSDN. Но если вы беспокоитесь о приведении, вам следует использовать более крупные типы, которые, безусловно, будут соответствовать вашим потребностям. Стандарт C++ не определяет точный размер типов (афаик), а только их относительные размеры (short короче, чем int и т. д.). Таким образом, вы не можете полагаться на точный размер этих типов, если только вы не используете int32 или __int32, которые, очевидно, не изменятся для 64-битных приложений.
Ответ 4 · Atul
Кросс-компиляция (для разных платформ, размеров указателей, порядка байтов и т. д.) существует уже много лет, и пока вы используете правильные инструменты и флаги для сборки своего 32-битного исполняемого файла, платформа сборки действительно не должна иметь значения.
В случае компилятора Microsoft это должно быть так же просто, как запустить Visual Studio и скомпилировать вашу программу с использованием конфигурации Win32 по умолчанию. Если вы предпочитаете командную строку, обязательно выберите 32-разрядные инструменты, вызвав команду Visual Studio. Подскажите (в отличие от x64 версии).
Кстати, если вы используете 64-битный Enterprise Server, вы можете включить роль гипервизора, установить 32-битную Win7 внутри виртуальной машины и фактически протестировать свою встроенную программу. Наконец, всегда полезно протестировать программу на реальной целевой платформе, на которой она будет выполняться :)...