Разница между 32-битным и 64-битным программным обеспечением заключается в размере указателей и, возможно, в размере целочисленных регистров. Вот и все.
Это означает, что все указатели в вашей программе в два раза больше. И (по крайней мере, в архитектуре ILP32 / LP64) ваши long
s также в два раза больше. Обычно это приводит к увеличению размера объектного кода примерно на 30%. Это значит, что …
- Ваш объектный код займет ~ 30% больше времени для загрузки с диска в оперативную память
- ваш объектный код будет занимать ~ 30% больше места в памяти
- вы эффективно сократили пропускную способность вашей памяти (для объектного кода) на ~ 20%
- вы эффективно сократили размер кэша команд на ~ 20%
Это оказывает существенное негативное влияние на производительность.
Делать это имеет смысл, только если вы можете как-то «выкупить» эти затраты производительности. По сути, есть два способа сделать это: вы выполняете много 64-битных целочисленных вычислений или вам требуется более 4 гигабайт отображенной памяти. Если один или оба из них верны, имеет смысл использовать 64-битное программное обеспечение, в противном случае это не так.
Примечание: есть некоторые архитектуры, в которых нет соответствующих 32- или 64-битных вариантов. В этом случае вопрос, очевидно, не имеет смысла. Наиболее известными являются IA64, который является только 64-битным и не имеет 32-битного варианта, и x86 / AMD64, хотя и тесно связанные, с разными архитектурами, x86 только 32-битная, AMD64 только 64-битная.
На самом деле, это последнее утверждение уже не на 100% верно. Linux недавно добавила x32 ABI, который позволяет запускать код AMD64 с 32-разрядными указателями, поэтому, хотя это и не «правильная» архитектура ЦП, это способ использовать архитектуру AMD64 таким образом, как если бы он имел собственный 32 битный вариант. Это было сделано именно потому, что упомянутые выше издержки производительности вызывали реальные измеримые, поддающиеся количественной оценке проблемы для реальных пользователей, выполняющих реальный код в реальных системах.