结构体对齐规则
1.
第一个成员在与结构体变量偏移量为
0
的地址处。
2.
其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数
=
编译器默认的一个对齐数 与 该成员大小的
较小值
。
VS中默认的值为8
Linux环境下没有默认的对齐数
3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
4.
如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
为什么会存在内存对齐
1.
平台原因
(
移植原因
)
:
不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特 定类型的数据,否则抛出硬件异常。
2.
性能原因
:
数据结构
(
尤其是栈
)
应该尽可能地在自然边界上对齐。
原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访 问。
总体来说:
结构体的内存对齐是拿
空间
来换取
时间
的做法。
大家可以看到,定义的两个结构体中的变量是一模一样的,只是位置发生了变化,结果所占的内存就发生了变化,这就是因为结构体存在内存对齐。
那在设计结构体的时候,我们既要满足对齐,又要节省空间,如何做到?
让占用空间小的成员尽量集中在一起。
修改默认对齐数
#pragma pack(8)
//
设置默认对齐数为
8
#pragma pack(4)
//
设置默认对齐数为4
#pragma pack(16)
//
设置默认对齐数为16
因此,可以根据需要自行设定对齐数