数据对齐:
- 许多计算机系统对基本数据类型合法地址做出了一些限制,要求某种类型对象的地址必须是某个值K(通常是2,4或8)的倍数。这种对齐限制简化了形成处理器和存储器系统之间的接口的硬件设计。例如,假设一个处理器总是从存储器中取出8个字节,则地址必须为8的倍数。如果我们能保证将所有的double类型数据的地址对齐成8的倍数,那么就可以用一个存储器操作来读或者写值了。否则,我们可能需要执行两次存储器访问,因为对象可能被分放在两个8字节存储块中。
- 当数据类型为结构体时,编译器可能需要在结构体字段的分配中插入间隙,以保证每个结构元素都满足它的对齐要求。
- 而结构本身对它的地址也有一些对齐要求,此时可能需要在结构末尾填充一些空间,以满足结构体整体的对齐(向结构体元素中最大的元素对齐)。
例如:
#include <stdio.h>
struct struct1
{
int a;
}s1;
struct struct2
{
char c[2];
}s2;
struct struct3
{
int a;
char c;
} s3;
int main()
{
printf("%d %d %d",sizeof(s1),sizeof(s2),sizeof(s3));
}
有些人认为s3的大小输出为5,其实运行结果显示,s3的大小为8。