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