C_and_CPP 板


LINE

開發平台(Platform): (Ex: Win10, Linux, ...) windows 8 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) gcc ( IDE == code::blocks ) 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) n/a 問題(Question): 最近在學習結構 struct,順便觀察所配置的記憶體數量,發現一個奇怪的現象 如果我定義一個結構 s1,裡面設定一個字元陣列 chArr struct s1{ char chArr[ N ] } chArr 的長度我隨便設定 N 因為我知道 char 所佔的記憶體就是 1 byte , 所以 printf( "%d" , sizeof(a) ); 數量就是 N, 到這裡都沒問題。 可是當我另外定義了一個結構 s2,裡面設定了一個字元陣列 chArr 跟 int num, 這時候,字元陣列的 chArr 的記憶體分配就會以 4 bytes 的倍數來跳 struct s2{ char ch[0]; int num; }; int main(){ struct s2 abc; printf("size of abc == %d" , sizeof(abc)); } 照理說如果有宣告一個結構變數 abc,那 abc 所佔的記憶體量應該是 char [n] + int n bytes + 4 bytes == (n+4) bytes 當我設定 ch[0] == printf 出來是 abc 的記憶體用量是 4 (正確) ( 0byte + 4bytes == 4bytes ) 可是當我增加字元陣列的 size 之後 ch[1] == printf 出來是 abc 的記憶體用量是 8 (怪) (預期是 5) ch[2] == printf 出來是 abc 的記憶體用量是 8 (怪) (預期是 6) ch[3] == printf 出來是 abc 的記憶體用量是 8 (怪) (預期是 7) ch[4] == printf 出來是 abc 的記憶體用量是 8 (正確) ch[5] == printf 出來是 abc 的記憶體用量是 12 (怪) (預期是 9) ch[6] == printf 出來是 abc 的記憶體用量是 12 (怪) (預期是 10) ch[7] == printf 出來是 abc 的記憶體用量是 12 (怪) (預期是 11) ch[8] == printf 出來是 abc 的記憶體用量是 12 (正確) ch[9] == printf 出來是 abc 的記憶體用量是 16 (怪) (預期是 13) ch[10] == printf 出來是 abc 的記憶體用量是 16 (怪) (預期是 14) ch[11] == printf 出來是 abc 的記憶體用量是 16 (怪) (預期是 15) ch[12] == printf 出來是 abc 的記憶體用量是 16 (正確) . . . 這個情況只有在結構有加入 int 的變數時會發生, 如果只有一個字元變數或兩個字元變數都不會發生, 其他型態變數,目前還沒發現, 想問是我哪邊 code 有寫錯嗎? 還是 compilor 的問題?? 謝謝。 餵入的資料(Input): 如上 預期的正確結果(Expected Output): 分析結果如上 錯誤結果(Wrong Output): 記憶體分配有違反 char type 1 byte 狀況 分析結果如上 程式碼(Code):(請善用置底文網頁, 記得排版) struct s2{ char ch[0]; int num; }; int main(){ struct s2 abc; printf("size of abc == %d" , sizeof(abc)); } 補充說明(Supplement): n/a --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.195.54.122
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1504712284.A.FD8.html
1F:→ Caesar08: 關鍵字:alignment與padding 09/06 23:48
2F:→ grayStone: code跟compiler都沒問題 09/06 23:53
3F:推 steve1012: 你想要很緊緻的話也可以加個keyword 讓他沒有padding 09/07 00:15
4F:→ steve1012: 主要是因為cpu 一次都抓很多個byte起來 所以compiler會 09/07 00:16
5F:→ steve1012: 加padding 細節你還是google一下有詳盡解說 09/07 00:16
6F:推 RouterHsieh: http://www.catb.org/esr/structure-packing/ 09/07 03:29
7F:推 b0920075: 對齊,這樣存取資源比較有效率 09/07 06:23
8F:推 s4300026: 咦! 我還以為是int、char宣告順序的問題,記憶體大小是 09/07 07:48
9F:→ s4300026: 根據struct內依序宣告中,占用最大記憶體空間的變數為 09/07 07:48
10F:→ s4300026: 宣告標準 09/07 07:48
11F:推 Killercat: 不是,純粹就是alignment 又不是union XD 09/07 08:35
12F:→ Killercat: 不過這的確是沒經驗的人容易踩到雷的地方 09/07 08:36
13F:推 TianBonBon: 有大大清楚支援unaligned的ARMv7編譯器會如何處置嗎? 09/07 12:31
14F:推 rbufghj9713: 對了!如果有使用class的virtual function也會有類 09/08 00:43
15F:→ rbufghj9713: 似的結果 09/08 00:43
16F:推 dou0228: padding 問題,如果不想要compiler幫你加,就要加keyword 09/13 09:44
17F:→ dou0228: 最常見的就是在網路封包上,定義好的結構不可以被更改 09/13 09:45
18F:→ Killercat: protocol絕對要用bitfield或者自己做好padding 09/13 23:50
19F:→ Killercat: 不過自製padding很容易搞出相容性的人命就是 bitfield 09/13 23:50
20F:→ Killercat: 相對好做很多 09/13 23:50







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Gossiping站內搜尋

TOP