Re: [問題] sizeof struct 大小很奇怪

看板C_and_CPP作者 (the Servant of Cthulhu)時間10年前 (2013/10/16 23:07), 編輯推噓7(706)
留言13則, 9人參與, 最新討論串2/2 (看更多)
※ 引述《kumusou ()》之銘言: : 如下 : struct a{ : char x; : int y; : short z; : }; : 結果去印sizeof(struct a)是12 : 而 : struct b{ : char x; : short y; : int z; : }; : 印出sizeof(struct b)是8 : 第一個我可以了解 : 0: x p p p : 4: y y y y : 8: z z p p : 但是就第二個來講 : 我以為也會是12 : 但是卻是8 : 0: x p p p : 4: y y p p : 8: z z z z : 但是卻好像不是這樣? C 在 x86 上大致上 align size 與 boundary 是看 struct 中 size 最大的, 並非一定都是 align 4 或 align 8。 所以這邊的 align size 應該是 sizeof(int),剛好是 4。 : 難道是? : 0: x p y y : 4: z z z z 所以這邊應該是 0: x y y p 4: z z z z : 這樣就很怪了阿 : 網路上查說這叫做對齊 : 主要目的是 "抓資料時可以一次抓" : 網路上舉例 若一個int從位置6開始放 : 放在 6 7 8 9 非似的倍數就要抓兩次 : 可是,如果是這樣那應該都會對齊四吧? : 為什麼第二種方式會對齊 2呢? : 假設機器是32bit的話,怎麼想也是對齊4吧? : struct x{ : char a; : char b; : short c; : } : 這卻會是 : 0: a b c c : 為啥不是 : 0: a x x x : 4: b x x x : 8: c c x x : 這樣呢? : 感謝! 所以這邊其實也不是 align 4,是 align to sizeof(short),也就是 2。 應該是: 0: a b 2: c c http://www.songho.ca/misc/alignment/dataalign.html 今天剛好也在想 alignment 的問題,這篇圖解對我幫助很大。 可以再順道看一下這個例子: struct foo { char a[10]; // 10-byte long b; // 4-byte or 8-byte char c[20]; // 20-byte }; 32bit 中 long 是 4-byte,所以這個的 alignment 是這樣: 0: a a a a 4: a a a a 8: a a p p 12: b b b b 16: c c c c 20: c c c c 24: c c c c 28: c c c c 32: c c c c 最後是 36 bytes。 如果是 64bit 則會是: 0: a a a a a a a a 8: a a p p p p p p 16: b b b b b b b b 24: c c c c c c c c 32: c c c c c c c c 40: c c c c p p p p 會得到 48 bytes。 但是只要 reorder 一下: struct foo { char a[10]; // 10-byte char c[20]; // 20-byte long b; // 8-byte }; 就會得到: 0: a a a a a a a a 8: a a c c c c c c 16: c c c c c c c c 24: c c c c c c p p 32: b b b b b b b b 40 bytes -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.117.176.182

10/16 23:10, , 1F
看懂了 感謝!
10/16 23:10, 1F
※ 編輯: keeper7478 來自: 140.117.176.182 (10/16 23:13)

10/16 23:16, , 2F
朝聖
10/16 23:16, 2F

10/16 23:16, , 3F
我覺得 0: x y y p 怪怪的. 可能誤會 "看 struct 中最大的"
10/16 23:16, 3F

10/16 23:17, , 4F
朝聖
10/16 23:17, 4F

10/16 23:18, , 5F
同意Feis大
10/16 23:18, 5F

10/16 23:18, , 6F
你看他STRUCT S5 所以應該是x p y y
10/16 23:18, 6F

10/16 23:20, , 7F
不過其實還是有點不確定 x y y p 與 x p y y 的要能差異
10/16 23:20, 7F

10/16 23:21, , 8F
效能差異,如果都是對齊4的情況下
10/16 23:21, 8F

10/16 23:40, , 9F
應該是我誤解了沒錯,我再研究看看,感謝!
10/16 23:40, 9F

10/17 00:11, , 10F
朝聖推
10/17 00:11, 10F

10/18 17:10, , 11F
推!!
10/18 17:10, 11F

10/19 00:25, , 12F
受教了~~
10/19 00:25, 12F

10/20 01:03, , 13F
嗚嗚 受教了
10/20 01:03, 13F
文章代碼(AID): #1INgkhwF (C_and_CPP)
文章代碼(AID): #1INgkhwF (C_and_CPP)