union package { char head; int body; }; struct message { char id; int crc; union package pack; }; int main() { printf("size=%d\n",sizeof(struct message)); return 0; }
union package{ char head; int body; };
struct message{ char id; int crc; union package pack; };一般默认是4字节对齐的,不足4字节的要补齐到4字节。
在32位系统中,结构体 message 的大小由其各个成员变量的大小和对齐方式来决定。在这个结构体中,包含一个 char 类型的 id、一个 int 类型的 crc 和一个 union package 类型的 pack。
首先,char 类型通常占用1个字节,int 类型通常占用4个字节。而联合体 union package 中的成员变量 head 占用1个字节,成员变量 body 占用4个字节。
在计算结构体大小时,编译器会对齐成员变量,以保证结构体在内存中的访问效率。在32位系统中,通常采用按照成员变量自身大小进行对齐的方式。
因此,在这个结构体中,id 占用1个字节,但是由于需要按照 int 类型的对齐方式进行对齐,所以会填充3个字节;crc 占用4个字节;pack 中的联合体在32位系统中会按照其中最大的成员变量的大小进行对齐,因此会占用4个字节。
综上所述,结构体 message 的大小为 1 + 3 + 4 + 4 = 12 字节。