看板 C_and_CPP 關於我們 聯絡資訊
跟上一篇的問題不太一樣 我用的是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)
loveme00835:http://ppt.cc/EUav 自己算算 02/24 23:42
VictorTom:你先單獨印sizeof struct裡的element, 即char/int等, 02/25 00:00
VictorTom:然後再考慮一下struct的alignment/padding的用途, 才能 02/25 00:01
VictorTom:推算出來為什麼在你的平台上你會跑出那樣的結果. 02/25 00:01
VictorTom:如果已經確認了int是4byte, 那請查一下alignment的目的, 02/25 00:03
VictorTom:並不是64bit的platform, struct的size就一定要對齊/為8 02/25 00:03
VictorTom:的倍數. 02/25 00:04
雖然你這麼說 但是好像也沒說到原因 我還是不太了解@@ ※ 編輯: XYX16888 來自: 123.192.156.147 (02/25 00:42)
chrisdar: sizeof(int) = 4 就是答案了.... 02/25 00:49
chrisdar:要公式嗎?sizeof(struct xxx) % sizeof(element) == 0 02/25 00:51
VictorTom:噗~~小弟我是沒說原因啊, 不就說了請你去查查了解它嗎XD 02/25 01:19
VictorTom:http://0rz.tw/ySgPF Wiki裡struct alignment的說明:) 02/25 01:26
purpose:V大修養太讚啦 02/25 01:31
loveme00835:樓上是想做啥 XDD 02/25 01:32
VictorTom:其實我不太懂怎麼了XD 本來想找中文的, 結果google前幾 02/25 01:34
VictorTom:名都只提到一小部份或講#param pack, 所以只好拉Wiki.XD 02/25 01:36
uranusjr:我一直有個印象之前有篇精美的文章說明很清楚但卻找不到 02/25 01:49
我有看 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)
VictorTom:我想我已經推過了, 沒有規定64bit一定要以8為單位, "最 02/25 09:59
VictorTom:小單位是8"是你錯誤的想法, struct的尾端要怎麼padding/ 02/25 10:00
VictorTom:alignment, 在我給的Wiki網頁裡的某一句粗體字說明.... 02/25 10:00
VictorTom:"the last member is padded with the number of bytes 02/25 10:01
VictorTom:....", 一行推不完, 剩下的自己去看, 至於源由我想好好 02/25 10:03
VictorTom:看完這則Wiki就應該會懂.... 02/25 10:03
stupid0319:因為RAX,EAX,AX,AH,AL? 02/25 11:13
XYX16888:我想我應該了解了 謝謝:) 02/25 16:18