Другие языки программирования и технологии

Какие есть особенности при переходе с 32 на 64 битное программирование?

ОО
Олег Омётов
30 074
в основном все упирается в размер переменных, как уже сказали
для i386
sizeof(int)=4
sizeof(long)=4
sizeof(long long)=8
sizeof(void *)=4
sizeof(size_t)=4

для x86_64:
sizeof(int)=4
sizeof(long)=8
sizeof(long long)=8
sizeof(void *)=8
sizeof(size_t)=8

следовательно указатели и size_t, больше не помещаются в тип int. тип long так же имеет тот же размер, что и long long.

есть и менее очевидные вещи. в i386 обычно используется выравнивание на 4 байта, потому, что выравнивание на больший размер часто не имеет смысла. поэтому тип double выравнивается на 4 байта, хоть и имеет размер 8. в x86_64 он уже выравнивается на 8 байт

struct test {
int a;
double b;
} t;

для i386
(void *)&t.b - (void *)&t.a) = 4

для x86_64
(void *)&t.b - (void *)&t.a) = 8

главным образом это затрагивает передачу данных между программами на разных архитектурах, посредством записи в файл и передачи по сети

чтобы избежать размолвок между архитектурами:
1) для передачи нужно использовать более конкретные типы, например uint32_t, int64_t из <cstdint>
2) записывать структуры в поток не целиком, а каждое поле по отдельности (или использовать упакованные структуры, но это не стандартизировано)
3) не использовать int для промежуточного хранения указателей или результатов функций, возвращающих size_t. и по возможности не передавать результаты таких функций без явного приведения типов в функции, которые требуют, например, int.

так же в x86_64 значительно изменился abi. это может затронуть ассемблерные вставки и особенно функции полностью написанные на ассемблере.
в частности, изменился набор регистров, которые необходимо сохранять внутри функции, а так же способ передачи и приема аргументов.
Immortal Immortal
Immortal Immortal
7 029
Лучший ответ
Есть, хотябы даже в адресации памяти и размере переменных)

Похожие вопросы