1. 程式人生 > >struct和union的大小

struct和union的大小

結構體預設對齊方式
在預設對齊方式下,結構體成員的記憶體分配滿足下面三個條件

1.第一個成員的地址和結構體的首地址相同,即偏移量為0。
2.結構體每個成員地址相對於結構體首地址的偏移量(offset)是該成員大小的整數倍,如果不是則編譯器會在成員之間新增填充位元組(internal adding)。
3.結構體總的大小是其成員中最大基本型別大小整數倍,如果不是編譯器會在其末尾新增填充位元組(trailing padding)。

offsetof函式可以得到結構體成員相對於該結構體首地址的偏移量


struct s0{
}//sizeof(s0)=1

struct s1{
    char
ch; //offsetof(s1, ch)=0; int a; //offsetof(s1, a)=4 double b; //offsetof(s1, b)=8 char c1; //offsetof(s1, c1)=16 }; //sizeof(s1)=24 struct s2{ char ch; //offsetof(s2, ch)=0 int a; //offsetof(s2, a)=4; double b; //offsetof(s2, b)=8; }; //sizeof(s2)=16
struct s3{ char k0; //offsetof(s3, k0)=0 char k1[9]; //offsetof(s3, k1)=1 double k2; //offsetof(s3, k2)=16 };//sizeof(s3)=24 struct s4{ char k0; //offsetof(s4, k0)=0 char k1[9]; //offsetof(s4, k1)=1 char k2; //offsetof(s4, k2)=10 };//sizeof(s4)=11

sizeof( struct ) = offsetof( last item ) + sizeof( last item ) + sizeof( trailing padding )

union型別滿足1和3,所有成員偏移量都為0;