Сегодня, к моему большому удивлению, я обнаружил, что
Когда оператор 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
, или я полностью сошел с ума?
В любом случае есть ли какой-либо другой оператор (или директива препроцессора или что-то еще), который позволяет компилятору знать, насколько велики структуры - кроме заполнения?
В противном случае, каким будет чистый способ чтения структуры необработанных данных из файла, для которого не требуется писать слишком много кода?
EDIT :
Я знаю, что это не правильный способ чтения / записи двоичных данных: у меня был бы другой результат в зависимости от машинного порядка и прочего. В любом случае, этот метод самый быстрый, я пытаюсь прочитать некоторые двоичные данные, чтобы быстро получить их содержимое, а не написать хорошее приложение, которое я собираюсь использовать в будущем или выпустить.