作者keeper7478 (the Servant of Cthulhu)
看板C_and_CPP
標題Re: [問題] 關於C STRUCT
時間Wed Oct 16 23:07:17 2013
※ 引述《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
推 kumusou:看懂了 感謝! 10/16 23:10
※ 編輯: keeper7478 來自: 140.117.176.182 (10/16 23:13)
推 s25g5d4:朝聖 10/16 23:16
→ Feis:我覺得 0: x y y p 怪怪的. 可能誤會 "看 struct 中最大的" 10/16 23:16
推 jay060191:朝聖 10/16 23:17
→ kumusou:同意Feis大 10/16 23:18
→ kumusou:你看他STRUCT S5 所以應該是x p y y 10/16 23:18
→ kumusou:不過其實還是有點不確定 x y y p 與 x p y y 的要能差異 10/16 23:20
→ kumusou:效能差異,如果都是對齊4的情況下 10/16 23:21
→ keeper7478:應該是我誤解了沒錯,我再研究看看,感謝! 10/16 23:40
推 tjjh89017:朝聖推 10/17 00:11
推 capslook1218:推!! 10/18 17:10
推 smith:受教了~~ 10/19 00:25
推 nikeasyanzi:嗚嗚 受教了 10/20 01:03