为什么这个结构24的大小?

时间:2014-08-12 11:52:36

标签: c++ c struct sizeof memory-alignment

我有一个我想要计算其大小的结构:

#pragma pack(push,4)
struct  MyStruct
{  
    uint32_t i1;    /* size=4, offset=0. */
    uint32_t i2;    /* size =4 offset =4 */
    uint16_t s1;    /* size =2 offset=8 */
    unsigned char c[8]; /* size=8 offset=12*/
    uint16_t s2;    /* size=2 offset=20. */
    uint16_t s3;    /* size=2 offset=24. */

} ; // total size is 26 

static_assert(sizeof(MyStruct) == 24, "size of MyStruct incorrect");
#pragma pack(pop)

静态断言显示大小为24,但我的计算表明它应该是26。

为什么尺寸为24?

我正在使用visual studio 2012开发Windows 7,32位应用程序

3 个答案:

答案 0 :(得分:26)

uint16_t的对齐方式仅为2,因此偏移量为:

#pragma pack(push,4)
struct  MyStruct
{  
    uint32_t i1;        /* offset=0  size=4 */
    uint32_t i2;        /* offset=4  size=4 */
    uint16_t s1;        /* offset=8  size=2 */
    unsigned char c[8]; /* offset=10 size=8 */
    uint16_t s2;        /* offset=18 size=2 */
    uint16_t s3;        /* offset=20 size=2 */
                        /* offset=22 padding=2 (needed to align MyStruct) */
} ; // total size is 24

修改 最后的填充是确保

的所有元素所必需的
MyStruct A[10]; // or
MyStruct*B = new MyStruct[10];

适当对齐。这要求sizeof(MyStruct)alignof(MyStruct)的倍数。在此,sizeof(MyStruct) = 6 * alignof(MyStruct)

任何struct / class类型始终填充到其对齐的下一个倍数。

答案 1 :(得分:22)

除了沃尔特的回答,请考虑自己捕捉这条鱼。您只需要printf函数和简单的算术:

  struct MyStruct ms;

  printf("sizeof(ms): %zd\n", sizeof(ms));

  printf("i1\t%td\n", (uint8_t*)&ms.i1 - (uint8_t*)&ms);
  printf("i2\t%td\n", (uint8_t*)&ms.i2 - (uint8_t*)&ms);
  printf("s1\t%td\n", (uint8_t*)&ms.s1 - (uint8_t*)&ms);
  printf("c \t%td\n", (uint8_t*)&ms.c  - (uint8_t*)&ms);
  printf("s2\t%td\n", (uint8_t*)&ms.s2 - (uint8_t*)&ms);
  printf("s3\t%td\n", (uint8_t*)&ms.s3 - (uint8_t*)&ms);

%zd用于打印size_t%td用于打印ptrdiff_t。普通%d可能在大多数系统上运行正常。)

输出:

sizeof(ms): 24
i1      0
i2      4
s1      8
c       10
s2      18
s3      20

答案 2 :(得分:-6)

4 4 2 8 2 2 - 将打包为:

4 4 4 8 2 2 - 最后两个以4个字节组合在一起。第三项需要填充,最后一项和前一项不需要填充。