读书人

构造体和类里面的成员地址是连续的吗

发布时间: 2012-10-28 09:54:44 作者: rapoo

结构体和类里面的成员地址是连续的吗?
今天我看到这样的写法

C/C++ code
            m_pDic=new unsigned char[m_Width*m_Height+sizeof(BITMAPINFOHEADER)+255*sizeof(RGBQUAD)];            m_pBih=(BITMAPINFOHEADER*)m_pDic;            m_pBih->biWidth=m_Width;            m_pBih->biHeight=m_Height;            m_pBih->biBitCount=8;            m_pBih->biClrImportant=0;            m_pBih->biCompression=0;            m_pBih->biClrUsed=256;            m_pBih->biPlanes=1;            m_pBih->biSize=40;            unsigned char *pRGB=NULL;            pRGB=m_pDic+sizeof(BITMAPINFOHEADER);            for (int j=0;j<255;j++)            {                pRGB[4*j]=j;                pRGB[4*j+1]=j;                pRGB[4*j+2]=j;                pRGB[4*j+3]=0;            }            m_pDibbits=m_pDic+sizeof(BITMAPINFOHEADER)+255*sizeof(RGBQUAD);


程序是要生成一个位图序列m_pDic,首先预估序列大小,new了一段堆内存
然后内存首地址赋给结构体m_pBih,它的类型是BITMAPINFOHEADER,然后给m_pBih的成员赋值,请问这些成员将会被放到m_pDic所指向的堆内存中吗?是连续的吗?


[解决办法]
C++ standard只保证plain old data(pod)类型结构或联合是内存连续的。pod的定义可以很容易搜索到。

win32中BITMAPINFOHEADER结构是一个pod结构。


[解决办法]
会在同一块连续的内存块里面 但是由于内存对齐 在两个成员中间可能会有若干字节是不属于任何变量的
[解决办法]
探讨

会在同一块连续的内存块里面 但是由于内存对齐 在两个成员中间可能会有若干字节是不属于任何变量的

[解决办法]
没听说过 “内存对齐” 么?

读书人网 >C++

热点推荐