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