Распределение структур обычно происходит на границе 4 байта. То есть компилятор будет дополнять типы данных в структуре до 4-байтовой границы, прежде чем начинать со следующего типа данных. Учитывая, что это c ++ (bool имеет размер 1), а не c (bool должен быть #define как-то)
struct blockHeaderStruct {
bool allocated; // 1 byte followed by 3 pad bytes
unsigned int length; // 4 bytes
};
typedef struct blockHeaderStruct blockHeader;
typedef struct blockHeaderStruct *blockHeaderPtr;
Результатом операции sizeof будет:
sizeof(blockHeader) == 8
sizeof(struct blockHeader) == 8
sizeof(blockHeaderPtr) == 4
(Примечание: последняя запись будет 8 для
64-битный компилятор. )
Не должно быть разницы в размерах между первыми двумя строками кода. Определение типа просто присваивает псевдоним существующему типу. Третий - это размер указателя, который составляет 4 байта на 32-битной машине и 8 байтов на 64-битной машине.
Чтобы это исправить, просто примените директиву #pragma pack, прежде чем определить структуру. Это заставляет компилятор упаковать на указанной границе. Обычно устанавливается как 1,2 или 4 (хотя 4 обычно является значением по умолчанию и не требует установки).
#include <stddef.h>
#include <stdio.h>
#pragma pack(1)
struct blockHeaderStruct {
bool allocated;
unsigned int length;
};
typedef struct blockHeaderStruct blockHeader;
int main()
{
printf("sizeof(blockHeader) == %li\n", sizeof(blockHeader));
printf("sizeof(struct blockHeader) == %li\n", sizeof(struct blockHeaderStruct));
return 0;
}
Скомпилировано с g ++ (Ubuntu
4.4.1-4ubuntu9) 4.4.1
Результаты:
sizeof(blockHeader) == 5
sizeof(structblockHeader) == 5
Вам обычно не нужна эта директива. Просто не забудьте упаковать свои структуры эффективно. Группируйте меньшие типы данных вместе. Не чередуйте 4-байтовые типы данных и 4-байтовые типы данных, так как ваши структуры будут в основном неиспользованным пространством. Это может вызвать ненужную пропускную способность для приложений, связанных с сетью.