Для вас, как для программиста, особой разницы нет. Но машинный код для доступа к целому байту намного проще / короче, чем для доступа к отдельному биту, поэтому использование битовых полей увеличивает объем сгенерированного кода.
На псевдо-ассемблере ваш сеттер может превратиться в нечто вроде:
ldb input1,b ; get the new value into accumulator b
movb b,value1 ; put it into the variable
rts ; return from subroutine
Но для битовых полей это не так просто:
ldb input1,b ; get the new value into accumulator b
movb bitfields,a ; get current bitfield values into accumulator a
cmpb b,#0 ; See what to do.
brz clearvalue1: ; If it's zero, go to clearing the bit
orb #$80,a ; set the bit representing value1.
bra resume: ; skip the clearing code.
clearvalue1:
andb #$7f,a ; clear the bit representing value1
resume:
movb a,bitfields ; put the value back
rts ; return
И он должен делать это для каждого из ваших сеттеров из 8 участников, и что-то подобное для добытчиков. Это складывает. Кроме того, даже самые глупые на сегодняшний день компиляторы, вероятно, встроили бы полнобайтовый установочный код, вместо того чтобы фактически вызывать подпрограмму. Для установщика битового поля это может зависеть от того, что вы компилируете, оптимизируя скорость и пространство.
И вы спрашивали только о логических значениях. Если они были целочисленными битовыми полями, то компилятору приходится иметь дело с загрузкой, маскированием предыдущих значений, смещением значения для выравнивания по его полю, маскированием неиспользуемых битов, and
/ or
значения на месте и последующей записью его обратно. в память.
Так зачем вам использовать одно против другого?
- Битовые поля медленнее, но упаковывают данные более эффективно.
- Недобитовые поля работают быстрее и требуют меньше машинного кода для доступа.
Как разработчик, это ваше суждение. Если вы будете хранить много экземпляров Structure
в памяти одновременно, экономия памяти может стоить того. Если вы не собираетесь иметь много экземпляров этой структуры в памяти одновременно, то скомпилированный код компенсирует экономию памяти, и вы жертвуете скоростью.