这不是一个安全的操作.编译器将以实现定义的方式添加填充.
一般而言,给定大小的成员将在偏移上对齐,该偏移是该大小的倍数.
给定填充的典型方式,这struct
很可能是16字节大小.物理布局很可能(但不一定)看起来像这样:
struct something { uint32_t a; // offset 0 uint8_t b; // offset 4 // 1 byte padding uint16_t c; // offset 6 uint32_t x; // offset 8 uint16_t y; // offset 12 uint8_t z; // offset 14 // 1 byte padding };
不要使用魔术数字.Intead,使用sizeof
运算符.
struct something *s = malloc(sizeof(struct something));
编辑:
如果您想增加struct
以特定方式布置的机会,请参阅本指南以了解结构包装.如果你遵循这里的做法,你很有可能(但不是100%)将你的struct
意志按照你期望的方式安排在记忆中.
对于gcc,您可以使用__attribute__((packed))
a struct
来删除a 中的填充struct
.但是,这样做可能会导致性能下降或导致页面错误.该-Wpadded
和-Wpacked
选项还可以告诉你更多关于填充.
这不是一个安全的操作.编译器将以实现定义的方式添加填充.
一般而言,给定大小的成员将在偏移上对齐,该偏移是该大小的倍数.
给定填充的典型方式,这struct
很可能是16字节大小.物理布局很可能(但不一定)看起来像这样:
struct something { uint32_t a; // offset 0 uint8_t b; // offset 4 // 1 byte padding uint16_t c; // offset 6 uint32_t x; // offset 8 uint16_t y; // offset 12 uint8_t z; // offset 14 // 1 byte padding };
不要使用魔术数字.Intead,使用sizeof
运算符.
struct something *s = malloc(sizeof(struct something));
编辑:
如果您想增加struct
以特定方式布置的机会,请参阅本指南以了解结构包装.如果你遵循这里的做法,你很有可能(但不是100%)将你的struct
意志按照你期望的方式安排在记忆中.
对于gcc,您可以使用__attribute__((packed))
a struct
来删除a 中的填充struct
.但是,这样做可能会导致性能下降或导致页面错误.该-Wpadded
和-Wpacked
选项还可以告诉你更多关于填充.