以前和很多網友發表過有關此類問題的文章,我也是通過這些文章和一些書籍瞭解了這個知識。這裏自我總結一下,希望對給爲有所幫助。
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;