请教:关于内存对齐问题。请解释以下程序运行结果。
程序1:
#include <iostream>
using namespace std;
class B0 //声明基类B0
{ public: //外部接口
char nV;
char n;
//void fun(){cout<<"Member of B0"<<endl;}
};
class B1: virtual public B0 //B0为虚基类,派生B1类
{ public: //新增外部接口
int nV1;
};
class B2: virtual public B0 //B0为虚基类,派生B2类
{ public: //新增外部接口
int nV2;
};
class D1: public B1, public B2 //派生类D1声明
{
public: //新增外部接口
int nVd;
//void fund(){cout<<"Member of D1"<<endl;}
};
void main() //程序主函数
{
B0 b0;
B1 b1;
B2 b2;
D1 d1; //声明D1类对象d1
d1.nV=2; //使用最远基类成员
//d1.fun();
cout<<sizeof(B0)<<" "<<sizeof(B1)<<" "<<sizeof(B2)<<" "<<sizeof(D1)<<endl;
cout<<sizeof(b0)<<" "<<sizeof(b1)<<" "<<sizeof(b2)<<" "<<sizeof(d1);
}
运行结果:
2 10 10 22
2 10 10 22
程序2:
#include <iostream>
using namespace std;
class X1
{
int i;//4个字节
char c1;//1个字节
char c2;//1个字节
};
class X2
{
char c1;//1个字节
int i;//4个字节
char c2;//1个字节
};
class X3
{
char c1;//1个字节
char c2;//1个字节
int i;//4个字节
};
int main()
{
cout<<"long "<<sizeof(long)<<"\n";
cout<<"float "<<sizeof(float)<<"\n";
cout<<"int "<<sizeof(int)<<"\n";
cout<<"char "<<sizeof(char)<<"\n";
X1 x1;
X2 x2;
X3 x3;
cout<<"x1 的大小 "<<sizeof(x1)<<"\n";
cout<<"x2 的大小 "<<sizeof(x2)<<"\n";
cout<<"x3 的大小 "<<sizeof(x3)<<"\n";
return 0;
}
运行结果:
long 4
float 4
int 4
char 1
x1 的大小 8
x2 的大小 12
x3 的大小 8
在visual c++6.0中运行。
对于程序1,由于使用virtual继承,会增加“内部调整指针”,以免使子类重复拷贝同一个数据。由此B0:2个char,2个字节;B1:BO继承来的的2个char+内部调整指针(4字节)+自身int nV1(4字节)=10字节;同理B2也是10字节;D1:从B1和B2那里来的两个“内部调整指针”(8字节)+nV1(4字节)+nV2(4字节)+nVd(4字节)=20字节,其中函数由于存放在代码区,不参与类的sizeof计算。由此好像根本没有考虑内存对齐的问题。
对于程序2,显示考虑了内存对齐。而且好像是4字节对齐。
但是我在project->setting->c/c++->category/code generation->structure member alignment 里,无论怎么设置,结果都一样。
不知道我上面的分析有没有错。
到底什么时候对齐,什么时候不对齐,具体对齐是怎么个对齐法呢?迷惑中。。。。
欢迎大家发表意见。希望了解的高手们能够抽出点点时间帮我解除疑惑,感激不尽!