Сегодня, с большим удивлением, я обнаружил, что
Когда оператор sizeof применяется к классу, структуре или типу объединения, результатом является количество байтов в объекте этого типа плюс добавление дополнений для выравнивания элементов на границах слов. Результат не обязательно соответствует размеру, рассчитанному путем добавления требований к хранению отдельных членов.
Я не знал об этом, и я уверен, что эта вещь нарушает мой старый код: для чтения двоичных файлов у меня были такие структуры, как этот:
struct Header
{
union {
char identc[4];
uint32 ident;
};
uint16 version;
};
и прочитать эти 6 байтов напрямую с помощью fread
, управляемых sizeof
:
fread( &header, sizeof(header), 1, f );
Но теперь sizeof(header)
возвращает 8
!
Возможно ли, что с более старыми версиями GCC sizeof(header)
вернулся 6
, или я полностью потерял сознание?
В любом случае есть ли какой-либо другой оператор (или директива препроцессора или что-то еще), позволяющий компилятору узнать, насколько велики структуры - исключая заполнение?
В противном случае, что было бы чистым способом чтения структуры raw-data из файла, для которого не требуется писать слишком много кода?
ИЗМЕНИТЬ: Я знаю, что это не правильный способ чтения/записи двоичных данных: у меня будет другой результат, зависящий от конечной машины и т.д. В любом случае, этот метод является самым быстрым, я пытаюсь прочитать некоторые двоичные данные, чтобы быстро получить его контент, а не писать хорошее приложение, которое я буду использовать в будущем или выпустить.