这几天在学c++时发现一个很有趣的问题,在此与大家共同分享。数据在系统存储中,有时并不是按我们所想象的那样存储。例如在如下的代码中,大家觉得结果会是什么。
#include <iostream>
using namespace std;
struct ABC{
ABC( ){ a = 0x12345678 , b = 0xabcd , c = 0xef ;}
unsigned char c ;
int a ;
short b ;
void main()
{
struct ABC tmp;
cout<<"len="<<sizeof(tmp));
}
结果为
len=12;
该结构体存储如下图所示:
当ABC中的成员的顺序改为如下形式,又会如何呢?
struct ABC
{
ABC( ){ a = 0x12345678 , b = 0xabcd , c = 0xef ;}
int a ;
unsigned char c ;
short b ;
结果为
len=8;
这是为什么呢?
其实这牵涉到数据对齐。若地址为0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
char或者unsigned char型可以存在以上16个位置中任意一个位置;short型数据只可以存在0、2、4等偶数位;int型会存储在0、4、8和12这四个位置。
因此,当我们定义结构体时,一定要注意成员变量之间的顺序,这样可以有效地利用存储空间。