Точки, которые следует учитывать при написании кода, переносимого на 32- и 64-битные архитектуры - PullRequest
3 голосов
/ 12 февраля 2010

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

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

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

Любые такие примеры могут помочь.

РЕДАКТИРОВАТЬ: Добавление в вики сообщества.

Ответы [ 5 ]

3 голосов
/ 12 февраля 2010

sizeof (int) может! = Sizeof (void *)

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

не передавать 0 в varargs, если получатель ожидает указатель. Это болезненно в C ++, где опытные разработчики знают, что 0 является допустимым нулевым указателем. C dev обычно использует NULL, так что вы, вероятно, в порядке

3 голосов
/ 12 февраля 2010
  • Некоторые интегральные типы могут иметь разные размеры
  • Указатели разной длины
  • Структура заполнения
  • Выравнивание

В Windows существует соглашение о вызовах только для x64, в отличие от кратного на обычном компьютере x32.

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

3 голосов
/ 12 февраля 2010

Установка указателей на стек занимает в два раза больше места. Размер стека может не изменяться между версиями ОС, поэтому код, работающий нормально в 32-битной системе, может произойти таинственным сбоем при компиляции и работать без изменений в 64-битной среде. Не спрашивайте меня, откуда я это знаю.

2 голосов
/ 12 февраля 2010

Написание автоматических тестов и их регулярное выполнение на обеих платформах.

2 голосов
/ 12 февраля 2010

Gotchas:

  1. Приведение указателей к целочисленным типам опасно
  2. Размеры структуры данных могут меняться
  3. Остерегайтесь расширения знака
  4. Отличается ABI?

Некоторые полезные советы и подсказки:

  1. Получите себе целочисленный тип собственного размера (из заголовка или typedef свой собственный) и используйте его, когда у вас есть переменные, не заботящиеся о размере.
  2. По возможности используйте явные типы переменных (u_int64_t, int_32_t и т. Д.)
...