Re: [問題] sizeof struct 大小很奇怪
看板C_and_CPP作者keeper7478 (the Servant of Cthulhu)時間10年前 (2013/10/16 23:07)推噓7(7推 0噓 6→)留言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
10/16 23:16, 3F
推
10/16 23:17, , 4F
10/16 23:17, 4F
→
10/16 23:18, , 5F
10/16 23:18, 5F
→
10/16 23:18, , 6F
10/16 23:18, 6F
→
10/16 23:20, , 7F
10/16 23:20, 7F
→
10/16 23:21, , 8F
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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):