作者yoco315 (眠月)
看板C_and_CPP
標題Re: [問題] struct大小
時間Sun Apr 23 03:06:50 2006
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
推 GameDemon:WOW 感恩感恩.看來我程式要改很多了XD 謝謝 04/23 03:08
推 drkkimo:這篇把原因說的很清楚呀 不過我記得好像還有一種解決方 04/23 03:10
推 drkkimo:法是調整編譯器的設定 因為之前也遇過類似問題 也是讀BM 04/23 03:10
→ drkkimo:P碰到 04/23 03:11
推 GameDemon:調編譯器??有請d大講解 04/23 03:11
→ GameDemon:我就是讀檔有問題. 04/23 03:16
推 LPH66:二樓說的是用編譯器指令 04/23 03:23
→ GameDemon:請問應該如何用呢?謝謝 04/23 03:24
推 drkkimo:8185篇有講到喔 我找到了:) 04/23 03:25
→ LPH66:像VC用的好像是#pragma pack(push,1) 04/23 03:23
→ drkkimo:試試 #pragma pack(1) 放在宣告struct之前 04/23 03:26
→ drkkimo:那篇精華區竟然找不到 等一下收精華 04/23 03:27
→ LPH66:push可不加 這是在後面配合pop來恢復原本設定用的 04/23 03:29
推 GameDemon:大感恩.問題完全解決了.謝謝兩位高手 04/23 03:30