类和结构体的内存分配

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

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

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/48176

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午12:02
下一篇 2023年2月9日 上午12:03

相关推荐