1. 结构体内存对齐规则
🍎① 第一个成员在与结构体偏移量为0的地址处。
🍎② 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
🍎③ 注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。VS中默认的对齐数为8
🍎④ 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的 整数倍。
🍎⑤ 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
🍎⑥ 使用#pragma pack
指令来指定结构体的对齐方式
🍎 #pragma pack (1)
这行代码可以指定结构体的对齐为 1
2. 为什么要内存对齐呢 ?
- 观察下图:
sizeof ( A )
的大小8
,sizeof ( AB)
的大小8
; 灰色的方框是多余没有用到的大小,但是也要算,因为内存对齐规则。 - 如果没有内存对齐,在存储
char _i
和int _a
的时候,对_a
内容的读取可能需要读取两次(第一次读取1
字节,第二次读取3
字节)