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

结构体内存对齐规则

  • 内存
  • 2024-05-26 02:03:13
  • 9871

一、c语言,结构体结构体与其他基本数据类型相同,例如int类型和字符类型,但是结构体可以做成你想要的任何数据类型。以便将来使用。[1]
在实际项目中,存在大量的结构体。开发人员经常使用结构来封装多个属性以形成新类型。由于C语言的内部编程比较简单,开发人员通常使用结构体来创建新的“属性”,目的是简化操作。[1]
结构体在函数中的作用不是简化,主要作用是封装。封装的优点是可重复使用。用户不需要关心这是什么,只要按定义使用即可。[1]
结构体的大小是与内存对齐的
结构体的大小不仅仅是结构元素的相加,因为我们主流的计算机使用的是32位字长的CPU类型它对于CPU来说,获取4字节的数字比获取1字节更高效、更容易。因此,如果结构体中每个成员的首地址都是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++结构体也具有结构体类的函数体中包含的函数默认是public的,而不是private的。