漫谈C语言结构体struct、公用体union空间占用,先用代码说话:#include<stdio.h>union union_data0{int a ;//本身占用4个字节char b ;//本身占用1个字节int c ;};union union_data1{short a;//本身占用2个字节char b[13];//本身占用13个字节int c ;//本身占用4个字节};struct struct_data{int a ;//int本身占用4个字节,偏移量为0char b ;//char本身占用1个字节,偏移量为4intc ;//1.暂时偏移量为5,编译器会判断出5不是4的整数倍,会在b的后面填充3个字节,最后c的偏移量为8,使得c的偏移量为c本身大小的整数倍;2.现在整个结构体大小暂时为12,编译器会判断12是不是其最大成员的整数倍,会在c末尾填充为整数倍,最后得出结果为12};int main(int argv,char* args[]){printf("%lu
",sizeof(union union_data0)) ;printf("%lu
",sizeof(union union_data1));printf("%lu
",sizeof(struct struct_data)) ;return 0;} 结果:[xx@localhost cdemo]$ gcc union_struct_space.c -o union_struct_space.out[xx@localhost cdemo]$ ./union_struct_space.out 41216
机构体(struct) 计算公式:
space(struct)=最后一个成员的偏移量+最后一个成员数据类型的大小+末尾填充字节数(公式1) 原则:
- 每个成员的偏移量要整除本身的大小,若不能整除,在其前的成员的后面字节填充。
- 最后的结构的大小要整除最大成员的大小,若不能整除,在最后的成员的后面字节填充。
公用体(union),是个结构,他的所有的成员相对于基地址的偏移量都为0,他的结构空间要大到足够容纳最“宽”的成员,并且对齐方式要适合于所有公用体中所有类型的成员。也就是说上面的公式(公式1)也是适用的。 计算公式:
space(union)=max(成员的偏移量)+某位填充字节 简单的原则:max(成员的偏移量)要整除各个成员,若不能整除,在最后的成员的后面字节填充。注:此处偏移量:机构中某个成员的实际地址离其结构的首地址的距离。引出问题:
- 为什么要字节对齐?
答:是为了能让计算机快速读写,是一种以时间换取空间的方式。
参考:C程序设计语言(第2版)中文版及英文版 高清晰PDF下载地址:http://www.linuxidc.com/Linux/2012-05/60076.htm
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-05/131046.htm