当前位置:首页 > 内存 > 正文

c语言结构体内存对齐规则

  • 内存
  • 2024-05-08 10:26:20
  • 4840

一、c语言,结构体其结构与其他基本数据类型相同,如int类型、char类型,但该结构可以转换为所需的数据类型。以方便日后使用。[1]
当前的项目中,存在大量的结构。开发人员经常使用结构体来封装某些属性以形成新类型。由于C语言的内部结构相对简单,开发人员通常使用结构体来创建新的“属性”,以简化操作。[1]
结构体在函数中的作用不是方便,主要作用是封装。封装的优点是可以重复使用。用户不必关心它是什么,只要按照定义使用即可。[1]
结构体大小是内存对齐的
结构体大小不是简单地添加结构体元素,因为我们传统的计算机使用长度为32位字的处理器。对于这种类型的数据,处理器检索4字节数比检索单个字节更高效、更方便。因此,如果该结构体的每个成员的首地址都是4的整数倍,那么检索数据项的效率会相对更高。这就是内存对齐的由来。特定平台上的每个编译器都有自己的默认“对齐因子”(也称为对齐模块)。程序员可以通过#pragmapack(n)预编译命令改变这个系数,n=1,2,4,8,16,其中n是你想要指定的“对齐系数”。[1]
规则:
1.数据成员对齐规则:对于结构体(或联合)的数据成员,第一个数据成员放置在偏移量0处,后续的每个数据成员放置在偏移量0处。每个数据成员根据指定值中的较小者进行对齐由#pragmapack和数据成员本身的长度。[1]
2.结构(或联合)的整体对齐规则:一旦数据成员完成了各自的对齐,结构(或联合)本身也必须对齐。对齐将基于价值。和结构(或联盟)。使用最大数据成员长度中的最小值。[1]
3.结合1和2,我们可以推断:当#pragmapack的n值等于或大于所有数据成员的长度时,n值的大小将不起作用。[1]
C++中的结构体
在C语言中,可以定义一种结构体类型,并将几个关联的变量组合成一个整体来使用。结构中的变量可以具有相同、部分相同或完全不同的数据类型。在C语言中,结构体不能包含函数。在面向对象编程中,对象具有状态(属性)和行为。状态存储在成员变量中,行为通过成员方法(函数)实现。C语言中的结构体只能描述对象的状态,而不能描述对象的行为。在C++中,考虑到从C语言过渡到C++语言的连续性,对结构进行了扩展。C++结构可以包含函数。这样,C++的结构体也就具备了类的功能。结构体内包含的函数默认是公共的,而不是私有的。
二、结构体内存对齐1.什么是内存对齐?
2理论上,对任何类型的变量的访问都可以从任何地址开始,但实际的计算机系统对基本数据类型在内存中的存储位置是有限制的。这些数据的首地址值需要是某个数字k(通常是4或8的倍数),这称为内存对齐。内存对齐是在计算机内存中组织数据(显示为变量地址)和数据(显示为CPU读取数据)的一种方式。
内存对齐由两个独立但又相互关联的部分组成:基本数据对齐和数据对齐。2.性能原因:数据结构(尤其是堆栈)应尽可能在自然边界上对齐。原因是为了访问未分配的内存,处理器必须进行两次内存访问。占用多少字节内存?

从打印结果可以看出一个问题,但是顺序不同,这会影响iOS的内存对齐


从成员大小的整数倍或者大小的整数倍开始成员的子成员(该成员只要有子成员(例如数组、结构体等)(例如,如果)int为4字节,则以某些struct成员的整数倍开始在struct中,那么struct成员的存储应该以最大内部体大小的整数倍开始(structastructb,b
如char、int、double等,那么b必须设置为倍数8个整数>size的最终结果是数据类型占用的空间量
class_getInstanceSize是类实例对象占用的内存量
malloc_size获取系统实际分配的内存量

>4<<4,右移4+左移4相当于将最后4位清零,那么k/16*16也是一样,16字节对齐算法,如果小于16,则对于一个对象来说就是0p>

正确的对齐方式是8字节对齐,8字节对齐足以满足对象的需求
防止一切容错,Apple系统使用16字节对齐的内存,主要是使用8字节对齐时,两个对象的内存距离更近,显得更紧凑,而16字节则相对宽松,方便Apple以后的扩展。。p>