Если скорость - то, что вам нужно, то этот вид битовой упаковки не является правильным направлением.
Процессор всегда имеет дело с операциями размером с слово, что означает, что если у вас есть, например, 32-битный процессор, наименьший объем памяти, с которым процессор (физически) может работать, составляет 32 бита или 4 байта (а для 64-битных процессоров его 64 бита или 8 байтов). В дальнейшем; процессор может загружать память только по границам слов, то есть по адресам байтов, кратным размеру слова.
Так что если вы используете выравнивание 5 (в данном случае), это означает, что ваши данные хранятся так:
| 32 bits | 32 bits | 32 bits | 32 bits |
[ data ] [ data ] [ data ]
00 00 00 00 01 01 00 01 00 00 00 12 34 56 78 00
IX Value IX Value XX XX IX Value
IX = Constructor index
Value = The stored value
XX = Unused byte
Как видите, данные все больше и больше не синхронизируются с границами слов, что заставляет процессор / программу выполнять больше работы для доступа к каждому элементу.
Если вы увеличите выравнивание до 8 (64 бита), ваши данные будут сохранены следующим образом:
| 32 bits | 32 bits | 32 bits | 32 bits | 32 bits | 32 bits |
[ data ] [ data ] [ data ]
00 00 00 00 01 00 00 00 01 00 01 00 00 00 00 00 00 12 34 56 78 00 00 00
IX Value XX XX XX IX Value XX XX XX XX XX IX Value XX XX XX
Это заставляет вас «тратить» 3 байта на элемент, но ваша структура данных будет намного быстрее, поскольку каждый элемент данных может быть загружен и интерпретирован с использованием гораздо меньшего количества инструкций и выровненных загрузок памяти.
Если вы все равно собираетесь использовать 8 байтов, вы можете также сделать свой индекс конструктора для Int32, так как вы в любом случае не используете эти байты для чего-либо еще, и делаете все своего базового значения выровненные по словам элементы дополнительно увеличивают скорость:
| 32 bits | 32 bits | 32 bits | 32 bits | 32 bits | 32 bits |
[ data ] [ data ] [ data ]
00 00 00 00 00 00 00 01 00 00 00 01 00 01 00 00 00 00 00 00 12 34 56 78
Index Value Index Value XX XX Index Value
Это цена, которую вы должны заплатить за более быстрые структуры данных в современных процессорных архитектурах.