关于结构体大小的疑问


   
  typedef struct A{
  
bool a;
long long d;
int e;

};

typedef struct B{
int e;
A d;
bool a;
};

为什么sizeof(A)的大小是24,sizeof(B)的大小是40,(int这里是4字节)
且B内部数据偏移是如何分布的

c

罪与罰与贖 11 years, 6 months ago

这个是因为结构体默认使用了 字节对齐 。即:
1.所有的类型,其存放的起始地址都是其类型大小的整数倍。例如char型可以放到任意地址,int型就只能放到4整数倍开始的地址等。
2.整个结构体的大小必须是单个内部元素所占空间中最大的那个元素所占空间的整数倍。

对于结构体A,其空间分配如下:

请输入图片描述

1.a是bool型,占1byte。
2.d是longlong类型,占8byte,由于字节对齐,起始地址需要能够被8整除,所以a后面需要7byte的额外空间,然后才是d的存放地址。
3.e是int型,占4byte。由于字节对齐,结构体B的整个空间大小需要是最大元素d(8byte)的整数倍,所以e后面需要4byte的额外空间。
所以结构体A的空间大小是24,也恰好是d(longlong)类型的空间8的整数倍。

对于结构体B,其空间分配如下:

请输入图片描述

1.e是int型,占4byte。
2.d是struct A类型,占24byte,由于字节对齐,起始地址需要能够被8整除,所以e后面需要4byte的额外,然后才是d的存放地址。
3.a是bool型,占1byte。由于字节对齐,结构体B的整个空间大小需要是被8的整数倍,所以a后面需要7byte的额外空间。
所以结构体B的空间大小是40。

LEMO❤ answered 11 years, 6 months ago

Your Answer