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

c语言内存对齐

内存对齐

什么是内存对齐?

内存对齐:在计算机中,内存空间按照字节划分,理论上可以从任何起始地址访问任何类型的变量。但实际上在访问特定类型的变量的时候需要从特定的地址开始,这就需要各种类型的数据按照一定的规则在空间上排列,而不是顺序的一个接一个的存放,这就是内存对齐,也叫字节对齐。

为什么要内存对齐?

内存对齐的作用:

  • 可移植性:因为不同平台对数据的在内存中的访问规则不同,不是所有的硬件都可以访问任意地址上的数据,某些硬件平台只能在特定的地址开始访问数据。所以需要内存对齐。
  • 性能原因:一般使用内存对齐可以提高CPU访问内存的效率。如32位的intel处理器通过总线访问内存数据,每个总线周期从偶地址开始访问32位的内存数据,内存数据以字节为单位存放。如果32位的数据没有存放在4字节整除的内存地址处,那么处理器需要两个总线周期对数据进行访问,显然效率下降很多;另外合理的利用字节对齐可以有效的节省存储空间。

默认内存对齐影响因素:与平台架构(位数)和编译器的默认设置有关。

结构体数据对齐

C++标准规定,int占一个机器字长。在32位系统中int占32位,也就是4个字节,而在老式的16位系统中,int占16位,即2个字节。而C++标准中只限制规定short int不能超过int的长度,具体长度的可以由C++编译器的实现厂商自行决定。目前流行的32位C++编译器中,通常int占4字节,short int占2字节。其中short int可以简写为short。

结构体如何处理数据对齐?
  • 结构体内各个成员都要按照自身数据类型的对齐模数对齐。( G C C GCC GCC编译器默认的组大队其模数为4,超过四字节时仍按照4字节对齐。 a r m − l i n u x − g c c arm-linux-gcc armlinuxgcc默认最大对齐字节数为8字节)

  • 结构体自身的对齐模数是该结构体中最大成员的size,或者其size的整数倍。

对于标准数据类型,它的地址只要是它的长度的整数倍就行了,而非标准数据类型按下面的原则对齐:
  
  数组 :按照基本数据类型对齐,第一个对齐了后面的自然也就对齐了。
  联合 :按其包含的长度最大的数据类型对齐。
  结构体: 结构体中每个数据类型都要对齐,结构体整体对齐方式:按照最大成员的size或其size的整数倍对齐。

比如有如下一个结构体:

  struct stu{
   
   char sex;
   int length;
   char name[

http://www.kler.cn/a/233709.html

相关文章:

  • ubuntu20.04安装FLIR灰点相机BFS-PGE-16S2C-CS的ROS驱动
  • CommandLineParser 使用
  • 实现一个BLE HID鼠标
  • C++初阶——list
  • vue项目npm run serve出现【- Network: unavailable】(从排查到放弃)
  • 券商隔夜单自动下单交易接口
  • Maui blazor ios 按设备类型设置是否启用safeArea
  • 思科模拟器命令大全详解
  • 当AGI遇到人形机器人
  • Lua可变参数函数
  • 使用virtualenv管理python环境
  • 如何将ChatGPT升级到4.0版本?如何充值?
  • Acwing---837. 连通块中点的数量
  • PCB板 3.3V和GND导通原因
  • 【NICN】之计算一个数的每位之和(递归实现)
  • Dubbo源码一:【Dubbo与Spring整合】
  • C语言中的宏定义:从常量到高级技巧
  • 十、项目开发总结报告(软件工程)
  • ubuntu篇---ubuntu安装python3.9
  • “深度解析Java虚拟机:运行时数据区域、垃圾收集、内存分配与回收策略、类加载机制“
  • 【前端高频面试题--TypeScript篇】
  • 从Unity到Three.js(画线组件line)
  • 微软AD域替代方案,助力企业摆脱hw期间被攻击的窘境
  • 【MySQL】-12 MySQL索引(上篇MySQL索引类型前置-2-高性能的索引策略)
  • Linux应用 进程间通信之共享内存(System V)
  • Webpack源码浅析