Извините, если вопрос звучит глупо. Я лишь смутно осведомлен о проблеме выравнивания данных и никогда не занимался 64-битным программированием. Я сейчас работаю над 32-битным кодом x86. Он часто обращается к массиву int. Иногда читается одно 32-разрядное целое число. Иногда два или более читаются. В какой-то момент я хотел бы сделать код 64-битным. Я не уверен, должен ли я объявить этот массив int как int
или же long int
, Я бы предпочел оставить ширину целого числа одинаковой, чтобы не беспокоиться о различиях. Я немного обеспокоен тем, что чтение / запись адреса, который не соответствует естественному слову, может быть медленным.
Штрафы за смещение возникают только тогда, когда загрузка или хранилище пересекают границу выравнивания. Граница обычно меньшее из:
Если вы загружаете 4-байтовое слово в 64-битной (8-байтовой) архитектуре. Это не должно быть 8-байтовым выравниванием. Он должен быть выровнен только 4 байта.
Аналогично, если вы загружаете 1-байтовый символ на любом компьютере, его совсем не нужно выравнивать.
* Обратите внимание, что векторы SIMD могут подразумевать больший естественный размер слова. Например, 16-байтовый SSE по-прежнему требует 16-байтового выравнивания как на x86, так и на x64. (за исключением явных смещенных загрузок / магазинов)
Короче говоря, нет необходимости беспокоиться о выравнивании данных. Язык и компилятор изо всех сил стараются помешать вам беспокоиться об этом.
Так что просто придерживайтесь того типа данных, который имеет для вас наибольшее значение.
64-разрядные процессоры x86 по-прежнему сильно оптимизированы для эффективного управления 32-разрядными значениями. Даже в 64-битных операционных системах доступ к 32-битным значениям, по крайней мере, так же быстр, как доступ к 64-битным значениям. На практике это будет быстрее, поскольку потребляется меньше места в кэш-памяти и пропускной способности памяти.
Здесь есть много полезной информации:
Производительность 32 бит против 64 бит арифметика
Еще больше информации https://superuser.com/questions/56540/32-bit-vs-64-bit-systems, где ответ утверждает, что видел худшее замедление на 5% (с точки зрения приложения, а не отдельных операций).
Короткий ответ — нет, вы не получите удар по производительности.
Всякий раз, когда вы обращаетесь к какой-либо ячейке памяти, вся строка кэша считывается в кэш L1, и любой последующий доступ к чему-либо в этой строке выполняется максимально быстро. Если ваш 32-битный доступ не пересекает строку кэша (чего не будет, если он находится на 32-битном выравнивании), он будет таким же быстрым, как и 64-битный доступ.