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