当前位置: 首页 > article >正文

结构体的大小以及内存对齐问题

结构体的大小怎么计算?什么是结构体的对齐? 

首先想要直到结构体的大小需要先了解结构体的内存对齐。那么,什么是结构体的内存对齐:

什么是结构体内存对齐

结构体的对齐 就是 结构体类型数据在内存中按照一定的对齐规律储存。结构体的对齐归根结底其实就是用空间换取时间的做法。至于为什么可以用空间换取时间呢?请看这么一张图:

假如一个结构体的数据像图中这样摆放。如果一个cpu读取数据, 是按照8个字节8个字节的规律进行读取。 那么他从a的首地址开始读取,第一次读取可以将int读完, 但是此时只读取了一半的double 类型的b, 想要完全读取b还要再多读取一次,这就造成了时间的浪费。

但是, 如果按照结构体对其规律进行数据存储呢? 

 

这样,我们读取一次读到一个完整的a, 在读取一次读到完整的b。

另外, 并不是所有的硬件都能随意的访问任意地址处的数据。这些硬件可能只能读取特定的地址处的数据。

结构体内存对齐的规律

结构体内存对齐需要遵循对齐数的规律, 即:结构体的第一个成员对齐到结构体首地址处, 其他成员对齐到对齐数整数倍的偏移量处。

把握住两个点:成员变量的对齐数、结构体的总大小

成员变量的对齐数:该对齐数为成员变量的大小和编译器默认大小的较小值。

结构体的总大小:每个成员变量的对齐数之中最大的那个对齐数的整数倍。

计算结构体的大小的时候, 只要严格遵守这对齐数的使用规则:

1、计算成员变量的偏移量时, 先确定该成员变量的对齐数,偏移量为对齐数的整数倍。

2、计算结构体变量时, 将所有成员变量的对齐数逐个比较一下。取出最大的对齐数,然后结构体的大小就是最大的对其数的整数倍。

下面来看一下练习:

 

 假如创建一个该结构体变量a , 那么a的内存存储是这样的:

我们来验证一下是否正确 

综上就是结构体大小的计算方法。 

 


http://www.kler.cn/news/233844.html

相关文章:

  • 搭建yum仓库服务器
  • C++ dfs 的状态表示(五十一)【第十一篇】
  • vue学习——集成sass
  • Ubuntu22.04 gnome-builder gnome C 应用程序习练笔记(三)
  • ideal打包,如何访问项目根目录的libs中的jar包
  • C++力扣题目494--目标和 474--一和零
  • 突破编程_C++_基础教程(类的高级特性)
  • 勒索病毒是什么,如何预防?
  • 鸿蒙开发-UI-图形-图片
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Toggle组件
  • MySQL进阶查询篇(3)-查询性能优化的常见技巧
  • C#系列-C#操作UDP发送接收数据(10)
  • C++入门篇(4)—— 类与对象(1)
  • Spring Boot 实现热插拔 AOP
  • 【机器学习】Ubuntu系统下CUDA驱动卸载及重装
  • 上线GPT应用的流程
  • 【北邮鲁鹏老师计算机视觉课程笔记】03 edge 边缘检测
  • 深入浅出:Golang的Crypto/SHA256库实战指南
  • Linux第45步_通过搭建“DNS服务器”学习图形化配置工具
  • conda创建环境,查看环境,激活环境,查看包,复制环境,删除环境,查看cuda版本,查看pytorch版本
  • 蓝桥杯官网练习题(翻转)
  • ubuntu22.04@laptop OpenCV Get Started: 006_annotating_images
  • Nginx管理配置中多种变量学习
  • 梯度提升树系列7——深入理解GBDT的参数调优
  • 【漏洞复现】狮子鱼CMS某SQL注入漏洞01
  • redis双写一致
  • Deepin基本环境查看(八)【系统安全:房、车、查房、查车】
  • 2.9日学习打卡----初学RabbitMQ(四)
  • Unity报错Currently selected scripting backend (IL2CPP) is not installed
  • 【数据存储+多任务爬虫】