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