Добавление 64-битной поддержки к существующему 32-битному коду, это сложно? - PullRequest
6 голосов
/ 02 ноября 2010

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

Ответы [ 3 ]

16 голосов
/ 02 ноября 2010

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

Типичные проблемы:

  • предположения о размерах int / long / pointer / etc
  • назначение указателей <=> целых
  • полагаясь на преобразование аргумента или результата функции по умолчанию (т.е. без прототипов функции)
  • неправильные спецификаторы формата printf / scanf
  • допущения относительно размера / выравнивания / заполнения структур (особенно в отношении файлового или сетевого ввода-вывода или взаимодействия с другими API и т. Д.)
  • неуместное приведение при выполнении арифметики с указателем со смещением байтов
1 голос
/ 02 ноября 2010

Просто не полагаться на предположение о размере машинного слова? всегда используйте sizeof, stdint.h и т. д. Если вы не полагаетесь на разные библиотечные вызовы для разных архитектур, не должно быть необходимости # ifdefs.

0 голосов
/ 02 ноября 2010

Самая простая стратегия - создать то, что у вас есть, с 64-битными настройками и протестировать его. Некоторый код не нужно менять вообще. Другой код, обычно с неверными предположениями о размере int / указателей, будет гораздо более хрупким, и его необходимо будет изменить, чтобы он не зависел от архитектуры.

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

...