以前和很多网友发表过有关此类问题的文章,我也是通过这些文章和一些书籍了解了这个知识。这里自我总结一下,希望对给为有所帮助。
struct MyStruct
{
char dda;//偏移量为0,满足对齐方式,dda占用1个字节;
double dda1;//下一个可用的地址的偏移量为1,不是sizeof(double)=8的倍数,需要补足7个字节才能
//使偏移量变为8(满足对齐方式),因此VC自动填充7个字节,dda1存放在偏移量为8
//的地址上,它占用8个字节。
int type;//下一个可用的地址的偏移量为16,是sizeof(int)=4的倍数,满足int的对齐方式,所以不
//需要VC自动填充,type存放在偏移量为16的地址上,它占用4个字节。
};//所有成员变量都分配了空间,空间总的大小为1+7+8+4=20,不是结构的节边界数(即结构中占用最
//大空间的类型所占用的字节数sizeof(double)=8)的倍数,所以需要填充4个字节,以满足结构的
//大小为sizeof(double)=8的倍数。
所以该结构总的大小为:sizeof(MyStruc)为1+7+8+4+4=24。
对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)
Char
偏移量必须为sizeof(char)即1的倍数
int, long, float, BOOL
偏移量必须为sizeof(int)即4的倍数
double
偏移量必须为sizeof(double)即8的倍数
Short
偏移量必须为sizeof(short)即2的倍数
静态成员不对结构或者类的大小产生影响!
一般建议这样子定义结构:
struct
{
unsigned int u8DummyLuid:10;//10表示是10个bit
unsigned int u16DummyLuid:16;
unsigned int u8DataSource:6;
} s_apoluid;