James Bryant

漫谈C语言结构体struct、公用体union空间占用

0
阅读(1510)

#include 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个字节,偏移量为0 char b ;//char本身占用1个字节,偏移量为4 int c ;//1.暂时偏移量为5,编译器会判断出5不是4的整数倍,会在b的后面填充3个字节,最后c的偏移量为8,使得c的偏移量为c本身大小的整数倍;2.现在整个结构体大小暂时为12,编译器会判断12是不是其最大成员的整数倍,会在c末尾填充为整数倍,最后得出结果为12 }; int main(int argv,char* args[]) { printf("%lu\n",sizeof(union union_data0)) ; printf("%lu\n",sizeof(union union_data1)); printf("%lu\n",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 4 12 16

机构体(struct)

  计算公式:space(struct)=最后一个成员的偏移量+最后一个成员数据类型的大小+末尾填充字节数(公式1)

原则:

  1. 每个成员的偏移量要整除本身的大小,若不能整除,在其前的成员的后面字节填充。
  2. 最后的结构的大小要整除最大成员的大小,若不能整除,在最后的成员的后面字节填充。 

公用体(union),是个结构,他的所有的成员相对于基地址的偏移量都为0,他的结构空间要大到足够容纳最“宽”的成员,并且对齐方式要适合于所有公用体中所有类型的成员。也就是说

上面的公式(公式1)也是适用的。

  计算公式:  space(union)=max(成员的偏移量)+某位填充字节

  简单的原则:max(成员的偏移量)要整除各个成员,若不能整除,在最后的成员的后面字节填充。

注:此处偏移量:机构中某个成员的实际地址离其结构的首地址的距离。

Baidu
map