[問題] struct 記憶體配置大小問題

看板C_and_CPP (C/C++)作者 (XYX)時間15年前 (2011/02/24 23:10), 編輯推噓8(8016)
留言24則, 7人參與, 最新討論串1/3 (看更多)
跟上一篇的問題不太一樣 我用的是macbook pro xcode compiler 應該是64bit的沒有錯 (一) #include <iostream> using namespace std; struct account { char id1; int age; char id2; }; int main (void) { account x; cout << sizeof(x) << endl; return 0; } print:12 (二) struct account { long name; char age; }; int main(void) { account x; cout << sizeof(x) << endl; return 0; } printf:16 重點來了 64bit 以8byte為單位 (二) 是16沒有問題 但是(一) 為什麼會是12呢? 記憶體分配圖示 ---- ---- || ---- ---- || ^ ^^^^ ^ chr int chr 我的想法是這樣 但是為什麼不是16? 感到非常疑惑@@ 如果問題很蠢的話 請不吝給小弟我指教 感謝!!! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.192.156.147 ※ 編輯: XYX16888 來自: 123.192.156.147 (02/24 23:13)

02/24 23:42, , 1F
http://ppt.cc/EUav 自己算算
02/24 23:42, 1F

02/25 00:00, , 2F
你先單獨印sizeof struct裡的element, 即char/int等,
02/25 00:00, 2F

02/25 00:01, , 3F
然後再考慮一下struct的alignment/padding的用途, 才能
02/25 00:01, 3F

02/25 00:01, , 4F
推算出來為什麼在你的平台上你會跑出那樣的結果.
02/25 00:01, 4F

02/25 00:03, , 5F
如果已經確認了int是4byte, 那請查一下alignment的目的,
02/25 00:03, 5F

02/25 00:03, , 6F
並不是64bit的platform, struct的size就一定要對齊/為8
02/25 00:03, 6F

02/25 00:04, , 7F
的倍數.
02/25 00:04, 7F
雖然你這麼說 但是好像也沒說到原因 我還是不太了解@@ ※ 編輯: XYX16888 來自: 123.192.156.147 (02/25 00:42)

02/25 00:49, , 8F
sizeof(int) = 4 就是答案了....
02/25 00:49, 8F

02/25 00:51, , 9F
要公式嗎?sizeof(struct xxx) % sizeof(element) == 0
02/25 00:51, 9F

02/25 01:19, , 10F
噗~~小弟我是沒說原因啊, 不就說了請你去查查了解它嗎XD
02/25 01:19, 10F

02/25 01:26, , 11F
http://0rz.tw/ySgPF Wiki裡struct alignment的說明:)
02/25 01:26, 11F

02/25 01:31, , 12F
V大修養太讚啦
02/25 01:31, 12F

02/25 01:32, , 13F
樓上是想做啥 XDD
02/25 01:32, 13F

02/25 01:34, , 14F
其實我不太懂怎麼了XD 本來想找中文的, 結果google前幾
02/25 01:34, 14F

02/25 01:36, , 15F
名都只提到一小部份或講#param pack, 所以只好拉Wiki.XD
02/25 01:36, 15F

02/25 01:49, , 16F
我一直有個印象之前有篇精美的文章說明很清楚但卻找不到
02/25 01:49, 16F
我有看 struct alignment 但是我仍舊覺得很疑惑才來問的 我再整理一次我的問題好了 (一)的記憶體分配圖示 記憶體分配圖示 || ---- ---- || ---- ---- || ^ ^^^^ ^ char int char 因為最小單位是8 最後8bytes中他只用了1bytes 所以我認為總共仍是配置16bytes 但是跑出來的結果是12 這是我主要的問題點 (二)的記憶體分配圖示 || ---- ---- || ---- ---- || ^^^^ ^^^^ ^ long char 因為最小單位是8所以最後那個8只用了1bytes 但仍配了8byte 總共是16byte 印出也是16沒有問題 我刻意po了兩個問題 就是要拿來比較 明明是一樣的分配 卻是不同的大小 所以才想問大家我的想法哪裡有誤?煩請不吝糾正我 ※ 編輯: XYX16888 來自: 140.112.4.181 (02/25 09:33) ※ 編輯: XYX16888 來自: 140.112.4.181 (02/25 09:35)

02/25 09:59, , 17F
我想我已經推過了, 沒有規定64bit一定要以8為單位, "最
02/25 09:59, 17F

02/25 10:00, , 18F
小單位是8"是你錯誤的想法, struct的尾端要怎麼padding/
02/25 10:00, 18F

02/25 10:00, , 19F
alignment, 在我給的Wiki網頁裡的某一句粗體字說明....
02/25 10:00, 19F

02/25 10:01, , 20F
"the last member is padded with the number of bytes
02/25 10:01, 20F

02/25 10:03, , 21F
....", 一行推不完, 剩下的自己去看, 至於源由我想好好
02/25 10:03, 21F

02/25 10:03, , 22F
看完這則Wiki就應該會懂....
02/25 10:03, 22F

02/25 11:13, , 23F
因為RAX,EAX,AX,AH,AL?
02/25 11:13, 23F

02/25 16:18, , 24F
我想我應該了解了 謝謝:)
02/25 16:18, 24F
文章代碼(AID): #1DPdJlnt (C_and_CPP)
文章代碼(AID): #1DPdJlnt (C_and_CPP)