Если взять следующий код:
#include <stdint.h>
struct {
enum Num { _0 = 0b000,_1,_2,_3,_4,_5,_6,_7 };
uint32_t pole1 : 6;
Num pole2 : 3;
uint32_t pole3 : 23;
} test;
int main()
{
volatile auto t = sizeof(test);
}
И скомпилировать его командой:
arm-none-eabi-g++ -c -mcpu=cortex-m0 -mthumb -Os -g -gdwarf-2 -std=c++17 -Wa,-a,-ad,-alms=build/main.lstmain.cpp -o build/main.o
Получим следующий ассемблерный код (привожу не весь):
17:main.cpp **** volatile auto t = sizeof(test);
32 .loc 1 17 0
33 0000 0823 movs r3, #8
Что говорит о том, что он считает размер структуры 8 байт, что неверно. При замене в битовом поле Num на uint32_t размер станет 4 байта, что верно. При перестановке pole1
и pole2
местами - 4 байта. При использовании битового поля, отличного от 3 бит с перечислением - 4 байта.
Это баг или я в чём то не прав?
Вам нужен 9.6 Bit-fields 14 стандарта. Там написано
The constant-expression shall be an integral constant expression with a value greater than or equal to zero. The value of the integral constant expression may be larger than the number of bits in the object representation (3.9) of the bit-field’s type; in such cases the extra bits are used as padding bits and do not participate in the value representation (3.9) of the bit-field. Allocation of bit-fields within a class object is implementation-defined. Alignment of bit-fields is implementation-defined. Bit-fields are packed into some addressable allocation unit.
То есть, упаковка битовых полей, размещение и паддинги на откуп разработчиков компилятора. гарантируется только что место, выделенное под битовое поле вместит то, что в нем хотят хранить (то есть попросили 3 бита - как минимум 3 бита дадут. Но могут и 10).
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Решил изучать C++ и написал первый простенький калькуляторОн то работает, но проблема вот в чем: когда ввожу первое десятичное число через...
В общем задача такая, что мне нужно проверить не перекрывает ли какое-нибудь окно моё приложениеДля этого я использую EnumDesktopWindows, в коллбеке...
Как можно определить в Makefile, под какую ОС компилируется программа? Желательно знать, хотя бы, в пределах IOS/Android/Windows/LinuxХотелось бы иметь общий...