漫谈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个字节
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)
原则:
- 每个成员的偏移量要整除本身的大小,若不能整除,在其前的成员的后面字节填充。
- 最后的结构的大小要整除最大成员的大小,若不能整除,在最后的成员的后面字节填充。
公用体(union),是个结构,他的所有的成员相对于基地址的偏移量都为0,他的结构空间要大到足够容纳最“宽”的成员,并且对齐方式要适合于所有公用体中所有类型的成员。也就是说
上面的公式(公式1)也是适用的。
计算公式: space(union)=max(成员的偏移量)+某位填充字节
简单的原则:max(成员的偏移量)要整除各个成员,若不能整除,在最后的成员的后面字节填充。
注:此处偏移量:机构中某个成员的实际地址离其结构的首地址的距离。
引出问题:
- 为什么要字节对齐?
答:是为了能让计算机快速读写,是一种以时间换取空间的方式。
参考:C程序设计语言(第2版),慕课网之LinuxC语言结构体(鸣谢)
本人第一次写博客,限于能力有限,难免错漏,请各位大神多多包涵,不吝赐笔,勘误指正。
漫谈C语言结构体struct、公用体union空间占用的更多相关文章
- 漫谈C语言结构体
相信大家对于结构体都不陌生.在此,分享出本人对C语言结构体的学习心得.如果你发现这个总结中有你以前所未掌握的,那本文也算是有点价值了.当然,水平有限,若发现不足之处恳请指出.代码文件test.c我放在 ...
- 漫谈C语言结构体【转】
相信大家对于结构体都不陌生.在此,分享出本人对C语言结构体的学习心得.如果你发现这个总结中有你以前所未掌握的,那本文也算是有点价值了.当然,水平有限,若发现不足之处恳请指出.代码文件test.c我放在 ...
- 结构体struct 与 联合union
1.C语言中的结构体 1.1 定义 结构体是由一系列相同或不同类型的变量组成的集合. struct 结构体名{ //struct为关键字,“结构体名”为用户定义的类型标识. ...
- C和C++中结构体(struct)、联合体(union)、枚举(enum)的区别
C++对C语言的结构.联合.枚举 这3种数据类型进行了扩展. 1.C++定义的结构名.联合名.枚举名 都是 类型名,可以直接用于变量的声明或定义.即在C++中定义变量时不必在结构名.联合名.枚举名 前 ...
- 结构体,公用体,枚举类型的sizeof
1)枚举类enum型空间计算 enum只是定义了一个常量集合,里面没有“元素”,而枚举类型是当做int来存储的,所以枚举类型的sizeof值都为4 enum color(red,pink,white, ...
- 结构体struct、联合体union、枚举类型enum
1.c语言中的类型 1)内置类型——char,short,int,float,double: 2)用户自定义类型(UDT)——struct结构体,union联合体,enum枚举类型 2.内存对齐 2. ...
- 结构体struct和联合体union以及enum枚举体5的区别
下面来自wikipedia: In computer science, a union is a value that may have any of several representations ...
- 解析C语言结构体对齐(内存对齐问题)
C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...
- C语言 结构体字节对齐问题
摘选自这位大神的博客 方法一: 结构体在内存中分配一块连续的内存,但结构体内的变量并不一定是连续存放的,这涉及到内存对齐. 原则1 数据成员对齐规则:结构(struct或联合union)的数据成员, ...
随机推荐
- Redis入门
一.安装 目前,官方最新稳定版本为3.0.7 # wget http://download.redis.io/releases/redis-3.0.7.tar.gz # cd /usr/local/ ...
- MVC, MVP, MVVM比较以及区别(下)
上一篇得到大家的关注,非常感谢.一些朋友评论中,希望快点出下一篇.由于自己对于这些模式的理解也是有限,所以这一篇来得迟了一些.对于这些模式的比较,是结合自己的理解,一些地方不一定准确,但是只有亮出自己 ...
- HBase 数据模型(Data Model)
HBase Data Model--HBase 数据模型(翻译) 在HBase中,数据是存储在有行有列的表格中.这是与关系型数据库重复的术语,并不是有用的类比.相反,HBase可以被认为是一个多维度的 ...
- 如何用 js 获取table 或者其他块状标签的 宽和高
这个比较简单,总体思想,标签标记一个id,js获取id,就能用它的属性了.介绍两种方法.请看下面代码. 第一种 <script> function width_table_all() { ...
- hibernate笔记--cascade级联以及inverse属性
cascade : 不管是单向多对一还是一对多,或者是双向的一对多关系,在一的一端映射文件中有一个set标签,在多的一端有many-to-one标签,拿前几篇笔记里讲的Grade和Student举例, ...
- Elasticsearch 教程--数据
在Elasticsearch中,每一个文档都有一个版本号码.每当文档产生变化时(包括删除),_version就会增大.在<版本控制>中,我们将会详细讲解如何使用_version的数字来确认 ...
- 验证ASP.NET页生命周期时间的触发顺序
操作步骤: 在项目中创建文件lifeCycleValidation.aspx文件: 在文件lifeCycleValidation.aspx中添加代码,创建一个label控件,名字为lbText,代码如 ...
- Asp.Net Core子应用由于配置中重复添加模块会引起IIS错误500.19
ASP.NET Core已经从IIS中解耦,可以作为自宿主程序运行,不再依赖IIS. 但我们还是需要强大的IIS作为前置服务器,IIS利用httpPlatformHandler模块来对后台的一些web ...
- 常用html、CSS、javascript前端命名规范
无论是从技术角度还是开发视角,对于web前端开发规范文档都有一定规范,本文就css3和html5的发展前景总结了一系列的web开发文档,仅供大家参考. 规范目的: 为提高团队协作效率, 便于后台人员添 ...
- poj1228--稳定凸包
题目大意:给你一个凸包上的某些点(可能在凸包内),询问是否能确定这个凸包. 思路:先求出题目给出的点的凸包,看看在凸包的每条边内(不包括端点)有没有点,若有,则这条边是确定的,若没有,则这条边不确定, ...