类和结构体的内存分配
类中的函数(方法)放在另外的内存当中,类的大小是类里面所有变量(数据)的内存总和,
另外一提的是,C++中有内存对齐的规则,如同下面的测试程序显示的一样,即内存占用总是4个字节的倍数。
另外,由于类的内存和结构体的都一样,取决与变量的总内存。
所以,类到结构体的类型转换是相当的方便,为了使分析更为清晰,
下面的测试参考了Directx中,D3DXCOLOR类到结构体D3DCOLORVALUE转换的实现。
ps:共有4个结构体,分别是
d3dcolorvalue, //有成员float a,r,g,b; 共16字节
d3dcolorvalue_x, //float a,r,g,b; char x; 共17字节
d3dcolorvalue_xyzm, //...char x,y,z,m 共20字节
d3dcolorvalue_xyzmn, //...char x,y,z,m,n 共21字节
还有一个类d3dxcolor,用来转换到结构体d3dcolorvalue格式
:
#include <iostream> using namespace std; typedef struct //占用16个字节= 4 * sizeof(float) { float a,r,g,b; // char x; //理论上占用1字节,由于内存对齐的规则,添加到4个字节 //char y,z,m; //占用的内存仍然和只有char x的时候一样,为4字节 //char n; /再加4字节 }d3dcolorvalue; typedef struct { float a,r,g,b; char x; //char y,z,m; //char n; }d3dcolorvalue_x; typedef struct { float a,r,g,b; char x; char y,z,m; //char n; }d3dcolorvalue_xyzm; typedef struct { float a,r,g,b; char x; char y,z,m; char n; }d3dcolorvalue_xyzmn; class d3dxcolor { public: d3dxcolor(float _a,float _r,float _g,float _b):a(_a),r(_r),g(_g),b(_b){} operator d3dcolorvalue() { return *(( d3dcolorvalue *) &a);//用同个地址,因为类d3dxcolor和结构体d3dcolor占用同样的大小的内存 } public: float a,r,g,b; }; int main() { cout<<sizeof(d3dxcolor)<<'\n'; cout<<sizeof(d3dcolorvalue)<<'\n'; cout<<sizeof(d3dcolorvalue_x)<<'\n'; cout<<sizeof(d3dcolorvalue_xyzm)<<'\n'; cout<<sizeof(d3dcolorvalue_xyzmn)<<'\n'; d3dcolorvalue dcv = {0.0f,0.0f,0.0f,0.0f}; cout<<dcv.a<<'.'<<dcv.r<<'.'<<dcv.g<<'.'<<dcv.b<<'\n'; dcv = d3dxcolor(1.0f,2.0f,3.0f,4.0f); cout<<dcv.a<<'.'<<dcv.r<<'.'<<dcv.g<<'.'<<dcv.b<<'\n'; return 0; }
看:可以发现内存对齐的规则,还有类到结构体成功转换的结果。
Thats it.