数据对齐
1. 基本类型
计算机系统对基本数据类型的合法地址做出一些限制,要求地址必须是某个值的倍数,这样的限制简化了处理器和存储器之间的接口设计。
首先对于char类型,只占一个字节,因此对char类型的地址没有限制;
在Linux系统中,short类型的地址必须是2的倍数(地址最低位必须是0),其他类型的地址必须是4的倍数(地址最低两位必须是00);
在Windows系统中,要求比较严格,K字节类型数据的地址必须是K的倍数,例如:short类型地址是2的倍数,int类型地址是4的倍数,double类型和long long类型地址是8的倍数;
2. 结构体
对于由基本数据类型组成的结构体而言,每个成员的地址都要满足对齐限制;整个结构体的大小必须是最大类型成员所占空间的倍数,结构体自身的地址则必须是结构体大小的倍数。例如:
struct {
int n; char c;
double d;
}
n的地址必须是4的倍数,d的地址必须是8的倍数,为了满足这些限制,则结构体各成员的偏移情况如下:
0 4 5 8 16
n | c | 填充 |d |
其中,为了保证d的地址对齐,c后面又填充了3个字节。整个结构体的大小是8的倍数,而结构体的地址则必须是16的倍数。
参考资料 《深入理解计算机系统》