口袋妖怪日月月精灵:对象的内存分配问题

来源:百度文库 编辑:高校问答 时间:2024/05/04 18:59:08
请高手过来帮忙,先谢过
定义一个数据类:
class stc2{
public:
short b1,b2;
char b3[5];
char b4;

char a1,a2;
int a3;
double a4;

short int ba1;
};
//使用 cout<<sizeof(stc2)<<endl; 求得值为32;
定义两个类:
class cls1{
public:
char a1,a2;
int a3;
double a4;

cls1(void):a1('i'),a2('b'),a3(512),a4(3.1415926){}
};

class cls2{
public:
short b1,b2;
char b3[5];
char b4;

cls2(void):b1(11),b2(22),b4('h'){b3[0]='p';b3[1]='y';b3[2]='t';b3[3]='a';b3[4]='\0';}
};
再定义第三个类来继承他们:
class cls2_1:public cls2,public cls1{
public:
short int ba1;

cls2_1(void):ba1(44){}
};
//使用 cout<<sizeof(cls2_1)<<endl;求得的值为40。
为什么第三个类的大小是40而不是32?为什么在a2、a3之间无缘无故空了两格??

一般都会对内存布局进行4字节的对齐,以便能够进行更快的操作,
visual c++ 就是这样。
而且类的大小是一个很复杂的东西,如果有纯虚函数等的话就更复杂了。

char a1,a2; 这里两字节,应为对4字节对齐,所以补两个空字节
才能做到4字节对齐;
int a3;
double a4;

如果象下面这样
char a1; 这里两字节,应为对4字节对齐,所以补3个空字节
才能做到4字节对齐;
int a3;
double a4;

大小没有变。