struct
{
char a;
int b;
short c;
};
每個成員起始地址必須為相應(yīng)類型的大小的倍數(shù),如a,起始地址為0,為sizeof(char)=1的倍數(shù),而到b的時候,因為這時地址為1,不是sizeof(int)=4的倍數(shù),所以編譯器會添加3個字節(jié)大小,此時地址為4,作為b的起始地址,b占用4個字節(jié),所以此時內(nèi)存地址為8,8是sizeof(short)=2的倍數(shù),所以c的起始地址為8,占兩個字節(jié),所以此時總的分配內(nèi)存大小為10,但是因為整個結(jié)構(gòu)體的最大成員為sizeof(int)=4,而10不為4的倍數(shù),所以要添加兩個字節(jié)為12.
使用#pragma pack(n)可以指定編譯器按n個字節(jié)作為對齊方式,這個指定只對那些大于n個字節(jié)的成員有效,如上例,若指定了以2個字節(jié)作為對齊,則a的起始地址為0,接著到b,因為sizeof(int)=4 < 2,所以要指定的對齊方式,此時地址為1,不為2的倍數(shù),所以要加1,所以b的起始地址為2,占用4個字節(jié)大小之后地址為6,接著是c,因為6是2的倍數(shù),所以6為c的起始地址,占用兩個字節(jié),總的大小為8