关于C#:Sizeof运算符返回不正确的大小?

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

由于某种原因,sizeof运算符返回该结构的伪大小(48而不是40

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

这是怎么发生的?如果把所有的尺寸加在一起,就得到了40,而不是48。埃多克斯一号〔1〕究竟是从哪里来的?

如果这是一些奇怪的x86-64特权,我如何确保结构的所有字段占用了我想要它们占用的数量(我要为这个结构分配一堆字节)?


你也可以摆脱城市的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编译这个行为和海湾合作委员会的文件,告诉你如何使用《aligned属性信息。