глюк с битовыми полями и перечислениями arm-none-eabi-gcc

178
17 января 2019, 18:40

Если взять следующий код:

#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 байта.

Это баг или я в чём то не прав?

Answer 1

Вам нужен 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).

READ ALSO
Как сделать, чтобы консоль принимала не только точку, но и запятую?

Как сделать, чтобы консоль принимала не только точку, но и запятую?

Решил изучать C++ и написал первый простенький калькуляторОн то работает, но проблема вот в чем: когда ввожу первое десятичное число через...

175
QWheelEvent::angleDelta() возвращаемое значение

QWheelEvent::angleDelta() возвращаемое значение

В Qt 5 появилась функция:

150
EnumDesktopWindows не видит окно поиск Windows10

EnumDesktopWindows не видит окно поиск Windows10

В общем задача такая, что мне нужно проверить не перекрывает ли какое-нибудь окно моё приложениеДля этого я использую EnumDesktopWindows, в коллбеке...

165
Платформонезависимый Makefile

Платформонезависимый Makefile

Как можно определить в Makefile, под какую ОС компилируется программа? Желательно знать, хотя бы, в пределах IOS/Android/Windows/LinuxХотелось бы иметь общий...

148