类和结构体的内存分配

类中的函数(方法)放在另外的内存当中,类的大小是类里面所有变量(数据)的内存总和,

另外一提的是,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.

转载于:https://www.cnblogs.com/Kelvinshere/archive/2012/04/21/Class_Struct.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值