唯有努力... 努力....再努力...
posted on 2008-02-29 17:23 浪跡天涯 閱讀(3487) 評論(17) 編輯 收藏 引用 所屬分類: C++
我在WM5的手機上運行后的結果是48,32位PC機估計結果一樣, sizeof(A) = 24 奇怪48是怎么來的 回復 更多評論
內存對齊,不同的編譯器你規則不同 回復 更多評論
這個不是sizeof()的問題吧,應該是struct的問題,其中的變量只能以自己大小整數倍的大小地址開始,所有就算變量相同,但是會因為順序不同最后struct的大小也會不同。不知道lz是不是想說這個? 回復 更多評論
你空間是不是被掛馬了? 回復 更多評論
int 4 union 20 c 10 34 如果考慮4字節對齊,應該是36 回復 更多評論
我的意思不是說sizeof()函數的問題。 我本意也并不是討論各個編譯器的規則。 我是想探討sizeof()求結構struct,union時的規則。 很不厚道,有人在機器上跑了一趟,不過依然謝謝。 union A: { int a[5]; //20 char b; //1 double c; //8 }我想的是union中變量共用內存,應以最長的為準,那就是20。可實際不然,sizeof(A)=24,后來一想應該是必須考慮A中各變量的默認內存對齊方式,必須以最長的double 8字節對齊,故應該是sizeof(A)=24。 關于sizeof(B)下篇再續,也希望大家多探討探討,寫下你的想法! 回復 更多評論
沒有掛木馬,是計數器卡著了@a 回復 更多評論
空間有毒!!!!大家小心 @浪跡天涯 如果是什么計數器卡著了,也請修改正常。 回復 更多評論
如果這樣寫我運行卻是40.. struct { int n; char c[10]; union { int a[5]; char b; double c; } u_a; } B; 回復 更多評論
struct B{int n; // 4字節A a; // 24字節char c[10]; // 10字節};實際占用38字節,但由于A是8字節對齊的,所以int n和char c[10]也需要8字節對齊,總共8+24+16=48 回復 更多評論
掛馬了,請清理 回復 更多評論
空間還有毒嗎?我什么東西都沒放啊! 回復 更多評論
非常感謝,說實話,我也不幸中招了 死得很慘,慚愧一下 回復 更多評論
字節對齊問題,可以取消pack(4)到pack(1) ,結果就又不一樣了哦 回復 更多評論
可以這么理解吧: 內存對齊主要目的是提升讀取數據的速度,通過保證 類型數據(n字節)保存在n倍數的內存 地址上。(n越大,要求越嚴格。) 要做到這點,有3個位置要求。 首地址,調到最嚴格地址倍數上,不影響大小。 中間項,按各自下一項的地址要求填充調整,影響大小。 最后一項,通過填充,達到最嚴格地址大小倍數,影響大小。 union A { int a[5]; char b; double c; }; 對于union A(共享內存),其實只有一項 至少需要20字節。首地址可以解釋為3種類型, A =a時, | 4 | 4 | 4 | 4 | 4 | ,20字節 中間和尾部都不需調整。 A =b時, |1|.................|, 中間和尾部都不需調整,20字節。 A =c時, | 8 |...........|, c作為最后項,需要調整20-〉24 因此,內存布局: | 4 | 4 | 4 | 4 | 4 |...| (...為padding),total=24 struct B { int n; A a; char c[10]; }; 這里要注意a,是作為A類型,是一項數據。 對于 struct B,最嚴格8字節, 首地址為8的倍數,填入n,(后面空4個字節,因為a的開始地址要求8的倍數) c,開始地址無特殊要求,a后面無需填充, 作為尾項,c,10-〉16 | 4 |...| 4 | 4 | 4 | 4 | 4 |...|10->16| to kimiya25: struct C{ int n; char c[10]; union { int a[5]; char b; double c; } u_a; }; n: 4 c: 10->12 u_a: 24 | 4 | 10 |...| 24 | //---------------------------------- 效率的解釋:例處理器每次從內存讀入8個字節的數據,當我們需要一個double類型的數據 時,通過在寫入內存時改保證數據寫在8倍數的地址上,就能夠只用一次讀,否則可能跨越 ,需要兩次 回復 更多評論
@瞇著眼的貓 很感謝瞇著眼的貓 解釋的很詳細! 我先前以為對sizeof()理解的很透徹,但遇到這個union一開始沒有理解透徹,直到在機器上跑一遍以后,才理解清楚。 回復 更多評論
問題出在union的對齊上面,要按照單位最長的成員對齊。。。。 學習了 回復 更多評論
Powered by: C++博客 Copyright © 浪跡天涯