1、为什么会产生数据对齐问题
8位CPU 当然不会产生数据对齐问题,当CPU发展到16,32位时,因为CPU的一次内存访问就能取回4个byte(且用32位举例,这个数据理所当然的缓存在相应的32位寄存器中)——里面可能存储了4个1byte的数据,也可能存储了2个2byte的数据……,所以CPU在逻辑上将内存单元寻址地址边界设置为4的倍数(如:0,4,8,12……),这是数据对齐产生的必要条件之一;另一个原因是程序中使用的数据类型并非都是4的倍数,如:char(1byte),short(2byte),int(4byte)等等。让我们考虑一下一个2byte的的变量在内存单元中排布吧:如果这个变量地址为0或1或2,那么CPU一次内存访问就能够取得你的变量;但如果是3的话,很不幸,CPU还得访问一次内存以取得全部数据。
2、举例说明
struct A {
char m_ch; //1 Byte
char *m_pStr; //4 Byte
}; //sizeof(A)=8,按4对齐
struct B {
char m_ch; //1 Byte
int m_count; //4 Byte
}; //sizeof(A)=8,按4对齐
struct C {
bool m_ok; //1 Byte
char m_name[6];//char 也是 1 Byte,6个char罢了
};
________________________________________结构体成员________________________________
struct X
{
double m_width; //8 Byte
char m_name[6]; //1 Byte per
}; //sizeof(X)=16
struct Y {
int m_no; //4 Byte
X m_x; //X按8对齐,故按8对齐,
}; //sizeof(Y)=8x3=24,提示可将X m_x扩展成struct X
struct X2
{
double m_width; //8 Byte
char m_name[9]; //1 Byte per,前8字节+8字节中的一个字节
}; //sizeof(X2)=8+8+8=24
struct X2
{
double m_width; //8 Byte 8x1
char m_name[9]; //占用8+8 8x2 和 8x3
};
struct Y2 {
int m_no; //4 Byte,占用另一个8字节 8x4
X2 m_x;
}; //sizeof(Y2)=8+8+8+8=32
enum DataType {IntData,CharData,VcharData};
struct Item
{
char ItemNAme[30]; //按4对齐,故是32
DataType ItemType; //enum站4个字节
char ItemDecr[50]; //按4对齐,所以是52
int ItemLength; //4字节
};
sizeof(Item) = 32+4+52+4=92
#pragma pack(2) //指定对齐方式是2
enum DataType {IntData,CharData,VcharData};
struct Item
{
char ItemNAme[30]; //30
DataType ItemType; //4
char ItemDecr[50]; //50
int ItemLength; //4
};
sizeof(Item) = 30+4+50+4=88