结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。
结构体和其他类型基础数据类型一样,例如int类型,char类型只不过结构体可以做成你想要的数据类型。以方便日后的使用。
在实际项目中,结构体是大量存在的。研发人员常使用结构体来封装一些属性来组成新的类型。由于C语言无法操作数据库,所以在项目中通过对结构体内部变量的操作将大量的数据存储在内存中,以完成对数据的存储和操作。
结构体定义:
struct name
{
成员定义;
}a;
可以在定义时创建变量(此时为全局变量)
也可以具体使用时再创建------struct name a;
结构体内存对齐
结构体的大小通常情况下会比所有成员变量类型所占的大小更大,而在就是因为结构体内存中坐了对齐操作
结构体的第一个成员对齐到和结构体变量起始位置偏移量为0地址
其他成员要对齐某个数字(对齐数)的整数倍数的地址处
对齐数=编译器默认的一个对齐数与该成员大小的较小值
*vs默认的值是8
结构体总大小为最大对齐数的整数倍
如果嵌套的结构体的情况,嵌套的结构体成员对齐到自己最大的对齐数的倍数,此时结构体大小包括嵌套结构体中的最大对齐数中最大的对齐数的倍数
为什么要内存对齐,原因有两点
平台原因–不是所有平台都能访问任意地址的任意数据
性能原因–未对齐的内存,处理器需要作两次内存访问,对齐的内存只需要一次
总体来说就是牺牲空间来节省时间
修改默认对齐数 ----- 一般设置2的次方数
#pragma pack(num)–设置为num
#pragma pack()—取消
位段式的结构
int _a:2; ---->只占2个bit位
int _b:num —>只占num个字节
位段的空间按需求int 4 个字节 char 1 个字节
位段有很多不确定因素,不能跨平台