Re: [問題] struct大小

看板C_and_CPP (C/C++)作者 (眠月)時間18年前 (2006/04/23 02:58), 編輯推噓8(807)
留言15則, 3人參與, 最新討論串1/1
alignment 的問題 為了效率,compiler 有時候會把資料成員排在某些倍數(例如4)的位置 typedef struct _bmp_file_header { unsigned short bfType; 2 unsigned long bfSize; 4 unsigned short bfReserved1; 2 unsigned short bfReserved2; 2 unsigned long bfOffBits; 4 }BMPFILEHEADER; 應該是要配14個 但是如果這樣配 typedef struct _bmp_file_header { unsigned short bfType; 4 本來是 2 unsigned long bfSize; 4 unsigned short bfReserved1; 2 unsigned short bfReserved2; 2 unsigned long bfOffBits; 4 }BMPFILEHEADER; 總共配16個 效能會更好 結果就變成第二個欄位以後的位置全部跑掉 如果你是從檔案讀進來的話 第二個欄位以後的資料就全錯 XD 解決方法...... typedef struct _bmp_file_header { unsigned char foo[14] ; }BMPFILEHEADER; 這樣就 14 byte 想要存取資料的時候用很醜的轉型 像是 offset = *((unsigned long *)(foo+10)) ; -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.129.180

04/23 03:08, , 1F
WOW 感恩感恩.看來我程式要改很多了XD 謝謝
04/23 03:08, 1F

04/23 03:10, , 2F
這篇把原因說的很清楚呀 不過我記得好像還有一種解決方
04/23 03:10, 2F

04/23 03:10, , 3F
法是調整編譯器的設定 因為之前也遇過類似問題 也是讀BM
04/23 03:10, 3F

04/23 03:11, , 4F
P碰到 
04/23 03:11, 4F

04/23 03:11, , 5F
調編譯器??有請d大講解
04/23 03:11, 5F

04/23 03:16, , 6F
我就是讀檔有問題.
04/23 03:16, 6F

04/23 03:23, , 7F
二樓說的是用編譯器指令
04/23 03:23, 7F

04/23 03:24, , 8F
請問應該如何用呢?謝謝
04/23 03:24, 8F

04/23 03:25, , 9F
8185篇有講到喔 我找到了:)
04/23 03:25, 9F

04/23 03:23, , 10F
像VC用的好像是#pragma pack(push,1)
04/23 03:23, 10F

04/23 03:26, , 11F
試試 #pragma pack(1) 放在宣告struct之前
04/23 03:26, 11F

04/23 03:27, , 12F
那篇精華區竟然找不到 等一下收精華
04/23 03:27, 12F

04/23 03:28, , 13F
這裡有MSDN的說明: http://0rz.net/961g7
04/23 03:28, 13F

04/23 03:29, , 14F
push可不加 這是在後面配合pop來恢復原本設定用的
04/23 03:29, 14F

04/23 03:30, , 15F
大感恩.問題完全解決了.謝謝兩位高手
04/23 03:30, 15F
文章代碼(AID): #14IdpoOs (C_and_CPP)
文章代碼(AID): #14IdpoOs (C_and_CPP)