struct和union的大小
阿新 • • 發佈:2019-02-08
結構體預設對齊方式
在預設對齊方式下,結構體成員的記憶體分配滿足下面三個條件
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;