数据对齐

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的倍数。

 

 

参考资料 《深入理解计算机系统》

原文地址:https://www.cnblogs.com/jqctop1/p/4681553.html