文章目录

  • 介绍
  • 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以及内存对齐相关推荐

  1. 转 Struct 和 Union区别 以及 对内存对齐方式的说明

    转载地址:http://blog.csdn.net/firefly_2002/article/details/7954458 一.Struct 和 Union有下列区别: 1.在存储多个成员信息时,编 ...

  2. 7. 重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用

    重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用 大家好,我是bin,又到了每周我们见面的时刻了,我的公众号在1月10号那天发布了第一篇文章?<从内核角度看IO ...

  3. 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用

    大家好,我是bin,又到了每周我们见面的时刻了,我在1月10号那天发布了第一篇文章<从内核角度看IO模型的演变>,在这篇文章中我们通过图解的方式以一个C10k的问题为主线,从内核角度详细阐 ...

  4. c语言中错误c2228,错误:C2228:''必须有class/struct/union

    我是一个很长时间的Java用户用Qt学习C++,我在理解方法如何工作方面遇到了很多麻烦.现在,我正在试图找出数据库,并试图用标题简化我的代码.通常在Java中我只有一个名为DatabaseContro ...

  5. c语言中错误c2228,error C2228:left of '.Push' must have class/struct/union type

    error C2228:left of '.Push' must have class/struct/union type0 一串都是这个错误 头疼死了 我怎么就发现不了哪里错了 分不多 麻烦了 谢谢 ...

  6. 【C++ Primer】 神秘的 sizeof(union) 、sizeof(struct) 和内存对齐技术

    一,union:C/C++关键字  共用体(联合) 共用体的声明和共用体变量定义与结构十分相似.形式为: union 共用体名 { 数据类型 成员名; 数据类型 成员名; ... } 变量名; 共用体 ...

  7. C/C++中的联合 union

    联合(union)在C/C++里面见得并不多,但是在一些对内存要求特别严格的地方,联合又是频繁出现,那么究竟什么是联合.怎么去用.有什么需要注意的地方呢?就这些问题,我试着做一些简单的回答,里面肯定还 ...

  8. 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 ...

  9. c语言union字节相同大小不同,C语言的struct/union字节对齐

    C语言的一大优势就是对内存空间的控制,当然,一般情况下对于开发人员来说都是透明的.看一个始终困扰初学者的问题:字节对齐! 先看四个重要的基本概念: 1.数据类型自身的对齐值: 对于char型数据,其自 ...

最新文章

  1. 最小树形图及其生产方法
  2. ubuntu允许root远程登陆sftp
  3. javaScript的DOM(一)
  4. Springboot集成cache的key生成策略
  5. 再谈二叉树(二叉树概念,二叉树的性质,二叉树的存储结构)
  6. excel html 查询,index.html
  7. SQL COALESCE函数和NULL
  8. hibernate总结一
  9. keymaker注册机之内在注册机教程
  10. html 内使用复制功能
  11. Hive-获取本月的第一天,本月的最后一天,本月的天数
  12. 【北京线下】FMI2018人工智能大数据技术沙龙第869期
  13. C++实现http客户端连接服务端及客户端json数据的解析
  14. 11-17今日分享SINGSALE使用虚拟卡支付教程
  15. mybatisPlus根据起止时间作为条件进行查询
  16. 农总行计算机类,中国农业银行总行计算机类笔试经验【精选】
  17. 数据库视图的基本概念及作用
  18. 17:57:54.359 [main] WARN com.baomidou.mybatisplus.generator.IDatabaseQuery$D
  19. chrome调试js
  20. AndroidWear 连接手持设备与穿戴设备模拟器到开发环境

热门文章

  1. html盒模型中border的写法,CSS盒模型--边框设置:border: 1px solid red(像素 样式 颜色 ),border-bottom:1px dotted #ccc...
  2. 世嘉土星和世嘉MD手柄定义,如何自制土星和MD手柄
  3. 尤雨溪:Vue 3 将成为新的默认版本
  4. 漫画喵的100行Python代码逆袭
  5. [ Arduino+Python ] 做一个串口屏,显示CPU使用率
  6. 牛散NO.2:MACD西施说风情,柳下惠高位勿迷情
  7. border设置1px看起来很粗问题
  8. 财务报表分析01.主要财务报表
  9. Google网盘 百度网盘文件互传-Multcloud
  10. NI LabVIEW开发环境(2.生成installer安装程序exe)