今天下午權(quán)哥忽然發(fā)過來一道題,后來說明是網(wǎng)上流傳的一道關(guān)于字節(jié)對齊的題,很久沒做了。嘗試著想啊想啊做了下。也算做出來了
#pragma pack(8)
struct s1{
short a;
long b;
};
struct s2{
char c;
s1 d;
long long e;
};
#pragma pack()
問
1.sizeof(s2) = ?
2.s2的s1中的a后面空了幾個字節(jié)接著是b?
回憶中的思路是:
s1 short(2) long(4)
0 1 2 3 4 5 6 7 8 9 10
short long 算錯了
對齊的原則是取小 當(dāng)前類型與pack(n)的字節(jié)數(shù)取小的那一個
short占兩個字節(jié)后當(dāng)前地址為2 long為四字節(jié)。可以被整除2 所以不用添字節(jié)
所以 sizeof(s1) = 6 算錯了這個地方算錯了。。非常對不起大家。。重寫的那天。。頭暈。。按1字節(jié)算了
也多謝朋友的提醒,以后一定注意.
重新修正為
s1 short(2) long(4)
0 1 2 3 4 5 6 7
short 補 long
對齊的原則是取小 當(dāng)前類型與pack(n)的字節(jié)數(shù)取小的那一個
short占兩個字節(jié) long是占四個字節(jié)。所以需要當(dāng)前地址可以被4整除 所以。。補兩個字節(jié)
所以 sizeof(s1) =8然后來算s2
char(1) s1被拆分 (short(2) long(4) 結(jié)構(gòu)體拆分后按最大字節(jié)對齊) longlong(8)
0 1 2 3 4567 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
char 補 short long 補 longlong
所以sizeof(s2)=24
a后面空了2個字節(jié)接著是b
應(yīng)該是沒有問題的 還有一點。。如果最后位數(shù)不夠的話。。。是按packer和結(jié)構(gòu)體兩個最小的字節(jié)數(shù)補齊