Хорошо, у вас классическая ситуация по сравнению со скоростью.Я собираюсь спросить, это ситуация, когда каждый бит имеет значение?Разве это так важно, если пара битов не совсем используется?Кодеру C во мне нравится либо массив из 3 32-битных значений, либо 64-битный 32-битный подход.Оптимизатору во мне не нравится тот факт, что 96-битные структуры данных не являются полностью дружественными к кешу и скорее будут заполнены 128-битными или, по крайней мере, не будут доступны через 4-байтовые границы в максимально возможной степени.
Использование 64-битного значения, в зависимости от вашей целевой платформы, позволяет маскировать всю 56-битную запись в 1 инструкции, тогда как 32-битная версия потребует как минимум 2 операции.Но если бы вы могли уменьшить это значение до 32-битных (или до 64-битных), тогда никакое маскирование и полная скорость не будут достигнуты, если вы сохраните это 64-битное значение на границах 64-битных адресов.Некоторые цели позволят вам получить доступ к несогласованным данным со штрафом, тогда как другие на самом деле будут генерировать исключения.
Самый безопасный способ - это массив из 3 32-битных значений.Ваше выравнивание гарантировано, математика может быть простой, если вы не перекрываете 32-битные границы своими битовыми полями, и она будет наиболее переносимой.Если вы должны преодолеть границу, вы получите быстрый удар с дополнительной маскировкой и смещением.Но, и это главный вопрос, действительно ли вы действительно уверены, что доступ к этим данным является проблемой скорости?У вас есть профиль, показывающий, что это узкое место?Если нет, я бы просто выбрал решение C ++ для битовых полей и назвал его хорошим.Безопаснее и проще в использовании - это всегда выигрыш.