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

zzpdljd 2016-05-05

漫谈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个字节,偏移量为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(成员的偏移量)要整除各个成员,若不能整除,在最后的成员的后面字节填充。

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

引出问题:

  1. 为什么要字节对齐?
    答:是为了能让计算机快速读写,是一种以时间换取空间的方式。

相关推荐