定义
在结构或者类中,编译器为每个成员变量按照其自然边界(alignment)分配空间,各个成员变量按照它们被声明的顺序在内存中顺序存储。
目的
- 便于cpu快速访问
- 节省存储空间
方法
在缺省情况下,编译器会为每一个变量或是数据单元按其自然对界条件分配空间。也可以使用#pragma pack n伪指令设置字节对齐的数字。默认是4。
具体对齐规则:第一个成员的地址和整个结构的地址相同。后面每个成员的地址偏移量必须是n和成员的大小的最大值的整数倍。
例子
class A
{
int i;
char c;
double d;
short s;
}
int是4个字节,char是1个字节,double是8个字节,short是2个字节。默认pack数为4。根据上面的内存对齐规则,可以算出每个成员的内存偏移量:
- int i:第一个成员,偏移量是0;
- char c:必须是max(4, 1) = 4的整数倍。前面成员的尾地址为4,所以偏移量为4;
- double d:必须是max(4, 8) = 8的整数倍。前面成员的尾地址为5,所以偏移量为8;
- short s:必须是max(4, 2) = 4的整数倍。前面成员的尾地址为16,所以偏移量为16。
内存分布情况如下:
int i | char c | double d | short s |
---|---|---|---|
0-4 | 4-5 | 8-16 | 16-18 |