字節對齊
今天下午權哥忽然發過來一道題,后來說明是網上流傳的一道關于字節對齊的題,很久沒做了。嘗試著想啊想啊做了下。也算做出來了
#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后面空了幾個字節接著是b?
回憶中的思路是:
s1 short(2) long(4)
0 1 2 3 4 5 6 7 8 9 10
short long 算錯了
short占兩個字節后當前地址為2 long為四字節。可以被整除2 所以不用添字節
所以 sizeof(s1) = 6 算錯了
這個地方算錯了。。非常對不起大家。。重寫的那天。。頭暈。。按1字節算了
也多謝朋友的提醒,以后一定注意.
重新修正為
s1 short(2) long(4)
0 1 2 3 4 5 6 7
short 補 long
對齊的原則是取小 當前類型與pack(n)的字節數取小的那一個
short占兩個字節 long是占四個字節。所以需要當前地址可以被4整除 所以。。補兩個字節
所以 sizeof(s1) =8
然后來算s2
char(1) s1被拆分 (short(2) long(4) 結構體拆分后按最大字節對齊) 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個字節接著是b
應該是沒有問題的 還有一點。。如果最后位數不夠的話。。。是按packer和結構體兩個最小的字節數補齊