作者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