[問題] sizeof struct 大小很奇怪
大家好:
我想問關於struct的問題
最近無聊發現一個問題,後來有上網查還是一知半解
請版上先進不吝指教
如下
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
但是卻好像不是這樣?
難道是?
0: x p y y
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
這樣呢?
感謝!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.136.182.93
→
10/16 21:43, , 1F
10/16 21:43, 1F
→
10/16 21:45, , 2F
10/16 21:45, 2F
→
10/16 21:46, , 3F
10/16 21:46, 3F
→
10/16 21:47, , 4F
10/16 21:47, 4F
→
10/16 21:54, , 5F
10/16 21:54, 5F
→
10/16 22:07, , 6F
10/16 22:07, 6F
→
10/16 22:25, , 7F
10/16 22:25, 7F
→
10/16 22:27, , 8F
10/16 22:27, 8F
→
10/16 22:36, , 9F
10/16 22:36, 9F
→
10/16 22:37, , 10F
10/16 22:37, 10F
→
10/16 22:42, , 11F
10/16 22:42, 11F
→
10/16 22:43, , 12F
10/16 22:43, 12F
推
10/16 22:45, , 13F
10/16 22:45, 13F
→
10/16 22:45, , 14F
10/16 22:45, 14F
→
10/16 22:46, , 15F
10/16 22:46, 15F
→
10/16 22:47, , 16F
10/16 22:47, 16F
→
10/16 22:47, , 17F
10/16 22:47, 17F
那如果都不對齊的話
如
char a;
short b;
int c;
a b b c c c c
再根據定義好的資料型態所對應的byte數
去讀資料,似乎又省空間又快?
※ 編輯: kumusou 來自: 220.136.182.93 (10/16 22:49)
→
10/16 22:48, , 18F
10/16 22:48, 18F
→
10/16 22:48, , 19F
10/16 22:48, 19F
→
10/16 22:49, , 20F
10/16 22:49, 20F
→
10/16 22:50, , 21F
10/16 22:50, 21F
→
10/16 22:50, , 22F
10/16 22:50, 22F
→
10/16 22:51, , 23F
10/16 22:51, 23F
→
10/16 22:51, , 24F
10/16 22:51, 24F
為啥要你要把他四個一組阿?
假設
a b b c c c c
0 1 2 3 4 5 6
他可以直接在位置3直接抓sizeof(int)出來就是c了不是嗎?
※ 編輯: kumusou 來自: 220.136.182.93 (10/16 22:53)
→
10/16 22:55, , 25F
10/16 22:55, 25F
其實我是想
如果| a b b c | c c c p |
c要讀兩次,所以要對齊四
i.e. | a p p p | b b p p | c c c c | 都抓一次就好
但是如果對齊二的話
i.e. | a p b b | c c c c | c讀一次 但他怎麼讀b啊?
我問題點比較像是這邊? (也是讀一次嗎?)
※ 編輯: kumusou 來自: 220.136.182.93 (10/16 22:59)
→
10/16 22:56, , 26F
10/16 22:56, 26F
→
10/16 23:00, , 27F
10/16 23:00, 27F
→
10/16 23:01, , 28F
10/16 23:01, 28F
→
10/16 23:02, , 29F
10/16 23:02, 29F
→
10/16 23:02, , 30F
10/16 23:02, 30F
→
10/16 23:03, , 31F
10/16 23:03, 31F
那我說一下我現在的理解喔
因為讀資料幾乎都是以記憶體4的倍數在讀
| a p b b | c c c c |
0 1 2 3 4 5 6 7
所以就算知道b的記憶體位置是從2開始
他一次還是會先讀到0起始的4bytes
在解析出b
這樣對嗎?
※ 編輯: kumusou 來自: 220.136.182.93 (10/16 23:06)
→
10/16 23:04, , 32F
10/16 23:04, 32F
→
10/16 23:04, , 33F
10/16 23:04, 33F
→
10/16 23:05, , 34F
10/16 23:05, 34F
→
10/16 23:06, , 35F
10/16 23:06, 35F
→
10/16 23:07, , 36F
10/16 23:07, 36F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):