内存对齐指计算机对基本数据类型在内存中的存放位置有限制,它会要求这些数据的内存地址是某个数的倍。
需要内存对齐的原因:
- 某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
- 提高内存访问的效率,避免可能一次就能读取出来的数据,需要读取多次。(以内存空间来换CPU的效率)
内存对齐的规则:
- 结构体的起始地址能被其最宽的成员大小整除。
- 第一个成员变量的偏移量为0,以后每个成员相对于结构体首地址的偏移都能被其自身大小整除如果不能,则在前一个成员后面填充字节。
- 结构体的总大小能够被最宽的成员大小整除,如有需要编译器会在最后一个成员之后加上填充字节。
#include <iostream>
using namespace std;
struct A
{
int b;
char a;
short c;
};
int main()
{
A a;
cout << sizeof(a) << endl; // 8
return 0;
}
在上述例子中假定b
成员的起始地址为0
,其占4个字节[0,1,2,3]
, 接下来是char
类型的a
,其占1个字节,而成员b
的下一个地址4
能被1整除因此可以直接跟在成员b
的后面,而short
类型成员c
占据2个字节,当前地址5
不能被2整除,故填充1个字节,成员c
从地址6
开始存储,占据[6,7]
。另外整个结构体大小必须是最大成员大小的整数倍,当前结构体占据字节数为8,刚好满足,无需再填充,故结构体大小为7个字节。