На что следует обращать внимание при написании 32-разрядного программного обеспечения на 64-разрядном компьютере? - PullRequest
1 голос
/ 16 сентября 2010

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

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

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

Ответы [ 4 ]

3 голосов
/ 16 сентября 2010

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

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

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

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

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

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

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

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

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

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

2 голосов
/ 16 сентября 2010

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

0 голосов
/ 16 сентября 2010

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

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

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

0 голосов
/ 16 сентября 2010

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

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

...