结构体和类里面的成员地址是连续的吗?
今天我看到这样的写法
- 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结构。
[解决办法]
会在同一块连续的内存块里面 但是由于内存对齐 在两个成员中间可能会有若干字节是不属于任何变量的
[解决办法]
[解决办法]
没听说过 “内存对齐” 么?