Программа находится на C, используя std = c99, это на 64-битной машине.Почему GCC использует это битовое поле?
struct epochs {
volatile unsigned int epoch : 1;
volatile unsigned int pulse : 1;
volatile unsigned int active0 : 7;
volatile unsigned int active1 : 7;
volatile unsigned int counter0 : 24;
volatile unsigned int counter1 : 24;
};
когда я проверяю SizeOf (эпохи) это дает мне 12.
я могу сказать GCC не раздуть его, добавив __attribute ((упакована)); поэтому я могу обойти это. Однако мне бы очень хотелось знать, почему 4 байта добавлены для заполнения этой 64-битной структуры?
Главное, что эта структура НЕОБХОДИМА, чтобы быть 64 битами, потому что она обновляется сразу в 64-разрядных операциях атомного свопа, что, конечно же, не будет работать на 12-байтовом значении.
Как правило, битовые поля могут быть дополнены для выполнения, я полагаю, что компилятор добавил дополнение между вашими членами данных, чтобы обеспечить их выравнивание по границам байтов. Добавление упакованного атрибута действительно подскажет компилятору не добавлять дополнение для производительности. – Skeen
Не используйте битовые поля, если вы хотите переносимое/воспроизводимое поведение. –
'struct epochs {unsigned int counter0: 24, pulse: 1, active0: 7, counter1: 24, epoch: 1, active1: 7; }; '8 байтов на моем Linux, Solaris и AIX. (кстати, почему все они были «неустойчивыми»?) – Cubbi