先用代码说话:

#include<stdio.h>
union union_data0{
int a ;//本身占用4个字节
char b ;//本身占用1个字节
int c ;
};
union union_data1{
short a;//本身占用2个字节
char b[];//本身占用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 ;
}

结果:

[xx@localhost cdemo]$ gcc union_struct_space.c -o union_struct_space.out
[xx@localhost cdemo]$ ./union_struct_space.out

机构体(struct)

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

    原则:

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

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

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

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

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

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

引出问题:

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

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

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

漫谈C语言结构体struct、公用体union空间占用的更多相关文章

  1. 漫谈C语言结构体

    相信大家对于结构体都不陌生.在此,分享出本人对C语言结构体的学习心得.如果你发现这个总结中有你以前所未掌握的,那本文也算是有点价值了.当然,水平有限,若发现不足之处恳请指出.代码文件test.c我放在 ...

  2. 漫谈C语言结构体【转】

    相信大家对于结构体都不陌生.在此,分享出本人对C语言结构体的学习心得.如果你发现这个总结中有你以前所未掌握的,那本文也算是有点价值了.当然,水平有限,若发现不足之处恳请指出.代码文件test.c我放在 ...

  3. 结构体struct 与 联合union

    1.C语言中的结构体 1.1 定义 结构体是由一系列相同或不同类型的变量组成的集合. struct 结构体名{               //struct为关键字,“结构体名”为用户定义的类型标识. ...

  4. C和C++中结构体(struct)、联合体(union)、枚举(enum)的区别

    C++对C语言的结构.联合.枚举 这3种数据类型进行了扩展. 1.C++定义的结构名.联合名.枚举名 都是 类型名,可以直接用于变量的声明或定义.即在C++中定义变量时不必在结构名.联合名.枚举名 前 ...

  5. 结构体,公用体,枚举类型的sizeof

    1)枚举类enum型空间计算 enum只是定义了一个常量集合,里面没有“元素”,而枚举类型是当做int来存储的,所以枚举类型的sizeof值都为4 enum color(red,pink,white, ...

  6. 结构体struct、联合体union、枚举类型enum

    1.c语言中的类型 1)内置类型——char,short,int,float,double: 2)用户自定义类型(UDT)——struct结构体,union联合体,enum枚举类型 2.内存对齐 2. ...

  7. 结构体struct和联合体union以及enum枚举体5的区别

    下面来自wikipedia: In computer science, a union is a value that may have any of several representations ...

  8. 解析C语言结构体对齐(内存对齐问题)

    C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...

  9. C语言 结构体字节对齐问题

    摘选自这位大神的博客 方法一: 结构体在内存中分配一块连续的内存,但结构体内的变量并不一定是连续存放的,这涉及到内存对齐. 原则1  数据成员对齐规则:结构(struct或联合union)的数据成员, ...

随机推荐

  1. Visual Studio常用小技巧一:代码段+快捷键+插件=效率

    用了visual studio 5年多,也该给自己做下备忘录了.每次进新的组换新的电脑,安装自己熟悉的环境又得重新配置,不做些备忘老会忘记一些东西.工具用的好,效率自然翻倍. 1,代码段 在Visua ...

  2. hibernate笔记--实体类映射文件"*.hbm.xml"详解

    实体类就是指普通的POJO,Hibernate并不知道那个实体类对应数据库的哪一张表,所以还需要配置一下,常用的方式就是*.hbm.xml文件[配置与@注解配置,这里介绍前者的详细属性: <?x ...

  3. Linux中解析json---jq

    遇到要在Linux上处理json的请求,换了熟悉的环境就抓瞎了,需要用心学习基础知识. jq官网:https://stedolan.github.io/jq   1.install   yum ins ...

  4. 7.5 数据注解特性--MaxLength&&MinLength

    MaxLength attribute can be applied to a string or array type property of a domain class. EF Code Fir ...

  5. ASP.Net Core MVC6 RC2 启动过程分析[偏源码分析]

    入口程序 如果做过Web之外开发的人,应该记得这个是标准的Console或者Winform的入口.为什么会这样呢? .NET Web Development and Tools Blog ASP.NE ...

  6. css实现小三角(原理)

    效果图如图1所示:(简单示范,有点丑,莫介意) PS:兼容IE,FF , chrome ,360安全浏览器 先讲下原理吧,如图2所示: 这个div的样式如下所示: div{ width: 0px; h ...

  7. Java中,方法的重写、重载的区别,以及多态的实例

    首先我们要明白什么是重写和重载 重写(override):子类方法覆盖了父类的方法.    (类与类之间继承的关系) 例:父类代码 public class Deng { public void Qi ...

  8. Verilog学习笔记基本语法篇(十二)········ 编译预处理

    h Verilog HDL语言和C语言一样也提供编译预处理的功能.在Verilog中为了和一般的语句相区别,这些预处理语句以符号"`"开头,注意,这个字符位于主键盘的左上角,其对应 ...

  9. 使用KMP算法判断是否为旋转词

    假设有两个字符串A.B,要判断它们是否为旋转词,只需构造一个"A+A"字符串,再与B比较,若B为A的旋转词,则使用KMP算法是可以得到结果的 代码如下: import java.u ...

  10. Tomcat源代码-门面模式(Facade)

    从Tomcat源码提炼出设计模式-门面设计模式: 概念 外部访问内部,耦合度增加,不利于扩展.而门面模式在内部基础上进行再度封装,只提供外部想要的方法.这时访问方式由“外部---内部”变为了“外部-- ...