结构体类型内存分析

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个字节的空位,实现了数据对齐。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值