Sizeof operator returns incorrect size?
Possible Duplicate:
Why isn't sizeof for a struct equal to the sum of sizeof of each member?
Extra bytes when declaring a member of a struct as uint32_t
由于某种原因,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | typedef struct mbdb_file_info { uint16_t mode; uint32_t unk0; uint32_t unk1; uint32_t user_id; uint32_t group_id; uint32_t time0; uint32_t time1; uint32_t time2; uint64_t length; uint8_t flag; uint8_t property_count; } mbdb_file_info; |
下面是一个简单的测试:
1 2 3 4 5 | printf("%ld %ld %ld %ld: %ld", sizeof(uint8_t), sizeof(uint16_t), sizeof(uint32_t), sizeof(uint64_t), sizeof(mbdb_file_info)); |
哪些印刷品:
1 2 4 8: 48
这是怎么发生的?如果把所有的尺寸加在一起,就得到了
如果这是一些奇怪的
你也可以摆脱城市的padding重新订购你的struct成员。例如,如果你在DECLARE 64位,然后的然后32,16,8是的,它会自然地对准padding有和没有额外的字节。
《append一些字节编译器可以在中间的struct为了align struct的成员。the size of the struct冰的氦的总和最小的尺寸,但不是两个信息技术有限公司。
因为结构的padding(不确定是这里的术语)。这场冰biggest 64位的,所以一切都根据它的对准。所以,我们有:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | typedef struct mbdb_file_info { uint16_t mode; // 16 + uint32_t unk0; // 32 = 48, so add 16 more to align to 64bit; uint32_t unk1; // this uint32_t user_id; // and this give 64bits ; uint32_t group_id; // again this uint32_t time0; // plus this - 64bits; uint32_t time1; // this uint32_t time2; // and this = 64bit ; uint64_t length; // this is 64 by itself uint8_t flag; // this uint8_t property_count; // +this is 16, add 48 for the alignment } mbdb_file_info; // when you sum all bits (+ the additional for padding) // you have exactly 48B |
这是因为所谓的结构padding对准。
什么是可能发生的是,8位和16位值是padded两个32位和冰padded整个结构是一个多部机器字大小(8)。
对准。某些类型的数据是以一定的边界对准(读:地址divisible市A 2因子,例如16),相关的结构,和这个原因padding的结构。
期权有两种suppress编译这个行为和海湾合作委员会的文件,告诉你如何使用《