1. 为了说明结构体类型内存分析的问题,首先来看一个例子:
struct A struct B
{ {
char c1; char c1;
int a; char c2;
float f; int a;
char c2; float f;
} ; };
对于结构体A与B,它们之间的差别是结构体内的成员变量顺序不一样,那么它们在内存中占的字节数又是怎样的呢?
经过测试:sizeof(A) = 16, sizeof(B) = 12
对于这个结果,是否出乎你的预料呢,为什么会是这样的结果呢,又该怎么样解释这种现象?
2.下面说明一下这种现象
为了加快CPU的存取速度,C++编译器在处理数据时,把结构体变量中的成员的大小按照4或8的倍数计算,这就是数据对齐(data alignment),或者叫字节对齐。上述例子sizeof大小的变化就是因为这个原因,并不是程序的错误,而是编译器为了使数据对齐而在结构中加上了适当的空位造成的。这样做可能会稍微浪费一点内存空间,但却换来了效率的大幅提高。系统是根据结构体内所包含的类型的大者分配空间单位的。有了这个概念后,再回头分析一下上面的例子。
对于结构体A来说,char c1占一个字节,而int a占4个字节,为了满足数据的对齐,因此在c1后填了3个空位,同理,float f占4个字节,char c2占一个字节,c2后填了3个空位,所以4个成员都占了4个字节,最后A的字节数为16。
对于结构体B来说,char c1,c2各占一个字节,int a ,float f各占4个字节,为了使c1,c2与后面的对齐,所以在c1,c2后填了2个空位,即c1,c2共占4个字节,所以B的字节数为12。
为了说明情况,再来看一个例子:
struct C
{
int a;
char b;
double c;
}
经过测试:sizeof(C) = 16
分析:int a占4个字节,接着char b占1个字节,但char b随后的double c要占8个字节,所以char b和double c不能挤在4个字节里。于是在char b和double c间填了3个字节的空位,实现了数据对齐。