Не читайте слишком много в "непереносимых битовых полях". Существуют два аспекта битовых полей, которые определяются реализацией: подпись и расположение и одно неуказанное: выравнивание единицы выделения, в которую они упакованы. Если вам больше ничего не нужно, кроме эффекта упаковки, их можно использовать как переносимые (при условии, что вы явно указываете ключевое слово signed
, где это необходимо) в качестве вызовов функций, которые также имеют неопределенные свойства.
Что касается производительности, профиль - лучший ответ, который вы можете получить. В идеальном мире не было бы никакой разницы между двумя произведениями. На практике их может быть несколько, но я могу придумать столько же причин в одном направлении, сколько и в другом. И он может быть очень чувствительным к контексту (например, логически бессмысленная разница между неподписанным и подписанным), поэтому измеряйте в контексте ...
Подводя итог, можно сказать, что разница, в основном, заключается в разнице стилей в тех случаях, когда у вас действительно есть выбор (т. Е. Нет, если важен точный макет). В этом случае, это оптимизация (по размеру, а не по скорости), и поэтому я бы хотел сначала написать код без него и добавить его, если необходимо. Таким образом, битовые поля являются очевидным выбором (модификации, которые нужно сделать, являются наименьшими для достижения результата и содержатся в уникальном месте определения, а не распространяются на все места использования).