许多计算机系统对基本数据类型的合法地址做出了一些限制,要求某种类型对象的地址必须是某个值K(通常是2,、4、8)的倍数,这种对齐限制简化了形成处理器和存储器系统之间接口的硬件设计,并且提高了存取效率,虽然可能浪费了空间。所以了解对齐,可以使我们在不降低效率的情况下以最低的空间存储数据
不同的硬件结构对对齐有不同的要求,IA32(Intel Architecture 32)硬件无论数据是都对齐,都能正常工作,但是,Intel还是建议要数据对齐以提高存储器系统性能。
对Linux系统来说,2字节数据类型(如short)的地址必须是2的倍数,而较大的数据类型(int、int*、float、double)的地址必须是4的倍数。
对windows不一样,double或者long long类型数据的地址是8的倍数。
看一下测试代码:(win7 32bit VC++平台)
#include <stdio.h>
struct A {
char c;
int i;
short s;
};
struct B {
char c;
short s;
int i;
};
#pragma pack(1) //按1字节对齐
struct C {
char c;
short s;
int i;
};
#pragma pack() //取消对齐
struct Test {
char c;
int i ;
float f;
double d;
int *pa;
char *pc;
short s;
};
struct TestOptimize {
char c;
short s;
int i ;
float f;
double d;
int *pa;
char *pc;