C中的struct,union,Bit Filed以及内存对齐
文章目录
- 介绍
- struct
- 字节对齐
- 再次探讨struct的内存占用
- 不使用反汇编计算占用空间
- Bit Filed
- union
- 参考资料
介绍
之前我们在这篇文章中提到了如何判断计算机的大小端,里面涉及到了union,这篇文章仔细讲一下这三种结构体的区别。
我的实验平台是x86_64的Ubuntu
struct
这是我们平时用的最多的结构体了,随手写出一个结构体
#include<stdio.h>
struct{char a;
}s;
int main()
{printf("%lu\n",sizeof(s));return 0;
}
这里由于sizeof的返回值是unsigned long,所以格式要写成%lu
运行结果:
跟我们想的一样,是一个字节
下面再扩展一下上面的代码
#include<stdio.h>
struct{char a;short b;int c;char d;
}s;
int main()
{printf("%lu\n",sizeof(s));return 0;
}
注意到char ,short, int ,char ,按照上面的图片中的所占的字节数计算,可以猜测该结构体总共占8个字节
运行结果:
这里的s占了12个字节,比之前计算的8个字节还多出4个字节,怎么回事?
这里就要涉及到字节对齐的知识了。
字节对齐
C是和底层很贴近的语言,C和汇编,和计算机结构有着密切的联系,我们平常写的源代码,编译器会对它做很多工作,从而让计算机能够更快的运行程序。
为了更方便的研究,我们先改动一下源代码
使用$gcc -g test.c
编译,一定要加上-g选项,不然后面的汇编代码看不出原来的c代码是怎么样的。
使用$objdump -dS a.out
查看反汇编的结果
与main有关的汇编代码如下
注意到这四条语句对应的汇编代码,其中右边的-0xc,-0xa…分别是这些数据存放的位置
我们可以画一幅图来分析内存布局,凑合着看吧这张图。。。
C中的struct,union,Bit Filed以及内存对齐相关推荐
- 转 Struct 和 Union区别 以及 对内存对齐方式的说明
转载地址:http://blog.csdn.net/firefly_2002/article/details/7954458 一.Struct 和 Union有下列区别: 1.在存储多个成员信息时,编 ...
- 7. 重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用
重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用 大家好,我是bin,又到了每周我们见面的时刻了,我的公众号在1月10号那天发布了第一篇文章?<从内核角度看IO ...
- 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用
大家好,我是bin,又到了每周我们见面的时刻了,我在1月10号那天发布了第一篇文章<从内核角度看IO模型的演变>,在这篇文章中我们通过图解的方式以一个C10k的问题为主线,从内核角度详细阐 ...
- c语言中错误c2228,错误:C2228:''必须有class/struct/union
我是一个很长时间的Java用户用Qt学习C++,我在理解方法如何工作方面遇到了很多麻烦.现在,我正在试图找出数据库,并试图用标题简化我的代码.通常在Java中我只有一个名为DatabaseContro ...
- c语言中错误c2228,error C2228:left of '.Push' must have class/struct/union type
error C2228:left of '.Push' must have class/struct/union type0 一串都是这个错误 头疼死了 我怎么就发现不了哪里错了 分不多 麻烦了 谢谢 ...
- 【C++ Primer】 神秘的 sizeof(union) 、sizeof(struct) 和内存对齐技术
一,union:C/C++关键字 共用体(联合) 共用体的声明和共用体变量定义与结构十分相似.形式为: union 共用体名 { 数据类型 成员名; 数据类型 成员名; ... } 变量名; 共用体 ...
- C/C++中的联合 union
联合(union)在C/C++里面见得并不多,但是在一些对内存要求特别严格的地方,联合又是频繁出现,那么究竟什么是联合.怎么去用.有什么需要注意的地方呢?就这些问题,我试着做一些简单的回答,里面肯定还 ...
- C++:error C2228: left of '.str' must have class/struct/union
如下代码报error C2228: left of '.str' must have class/struct/union #include <string> #include <i ...
- c语言union字节相同大小不同,C语言的struct/union字节对齐
C语言的一大优势就是对内存空间的控制,当然,一般情况下对于开发人员来说都是透明的.看一个始终困扰初学者的问题:字节对齐! 先看四个重要的基本概念: 1.数据类型自身的对齐值: 对于char型数据,其自 ...
最新文章
- 最小树形图及其生产方法
- ubuntu允许root远程登陆sftp
- javaScript的DOM(一)
- Springboot集成cache的key生成策略
- 再谈二叉树(二叉树概念,二叉树的性质,二叉树的存储结构)
- excel html 查询,index.html
- SQL COALESCE函数和NULL
- hibernate总结一
- keymaker注册机之内在注册机教程
- html 内使用复制功能
- Hive-获取本月的第一天,本月的最后一天,本月的天数
- 【北京线下】FMI2018人工智能大数据技术沙龙第869期
- C++实现http客户端连接服务端及客户端json数据的解析
- 11-17今日分享SINGSALE使用虚拟卡支付教程
- mybatisPlus根据起止时间作为条件进行查询
- 农总行计算机类,中国农业银行总行计算机类笔试经验【精选】
- 数据库视图的基本概念及作用
- 17:57:54.359 [main] WARN com.baomidou.mybatisplus.generator.IDatabaseQuery$D
- chrome调试js
- AndroidWear 连接手持设备与穿戴设备模拟器到开发环境
热门文章
- html盒模型中border的写法,CSS盒模型--边框设置:border: 1px solid red(像素 样式 颜色 ),border-bottom:1px dotted #ccc...
- 世嘉土星和世嘉MD手柄定义,如何自制土星和MD手柄
- 尤雨溪:Vue 3 将成为新的默认版本
- 漫画喵的100行Python代码逆袭
- [ Arduino+Python ] 做一个串口屏,显示CPU使用率
- 牛散NO.2:MACD西施说风情,柳下惠高位勿迷情
- border设置1px看起来很粗问题
- 财务报表分析01.主要财务报表
- Google网盘 百度网盘文件互传-Multcloud
- NI LabVIEW开发环境(2.生成installer安装程序exe)