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

先用代码说话:spa

#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)code

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

    原则:编译器

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

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

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

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

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

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

引出问题:

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

参考:C程序设计语言(第2版),慕课网之LinuxC语言结构体(鸣谢)

本人第一次写博客,限于能力有限,不免错漏,请各位大神多多包涵,不吝赐笔,勘误指正。

相关文章
相关标签/搜索