Плотно упакованная структура получает избыточное неправильное заполнение, используя mingw-g++ в Linux
* Фон *
У меня есть следующая структура:
struct LayerConfig {
// General Configuration Parameters
unsigned int sel_idb_ilmn : 8;
unsigned int sel_audio_lite_port : 8;
unsigned int idb_2d_offset : 16;
unsigned int idb_2d_shift_step : 16;
unsigned int idb_2d_col_step : 16;
unsigned int idb_2d_col_length : 8;
unsigned int idb_auto_shift_window : 8;
unsigned int idb_op_mode : 8;
unsigned int idb_8bit_16bitn : 8;
// more fields ...
};
Я использую его в своем приложении C++11, которое я создаю под Ubuntu как для Ubuntu (используя g++), так и для окон, использующих (mingw-g++).
версия mingw-g ++ x86_64-w64-mingw32-g++ (GCC) 8.3-win32 20190406
* Проблема * Используя mingw-g++, компилятор добавляет 4 байта заполнения, поэтому размер структуры составляет 470 по сравнению с 466 байтами, созданными в Linux (что также является ожидаемым размером).
* что я пробовал *
- использование
#pragma pack(1)
директива - использование
__attribute__((packed))
директива - Добавлять
-mno-ms-bitfields
на флаги компилятора - перекодировать структуру, чтобы не использовать битовые поля, а использовать типы примитивов int, short и char (поскольку все члены имеют размер {1,2,4} байтов
* Вопрос * Я знаю, что это хорошо известная проблема mingw g ++. Мне нужно сериализовать эту структуру в файл, где файл не содержит ничего, кроме самих данных. Любой возможный обходной путь, который не вовлекает запись поле за полем (который тогда требует непрерывного обслуживания этой сериализации)? Примечание. Мне нужно, чтобы мое приложение работало как в Linux, так и в Windows, поэтому я создаю его с помощью g ++ и mingw-g ++.