奇怪,怎么多出两个字节?

sizheng0320 2006-03-02 09:53:12
struct T_BITMAPFILEHEADER { // bmp文件头
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
};

上面这个结构体,自己数出来以及文件中实际的都是14个字节,可是为什么sizeof得到的是16个字节啊????
...全文
166 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
姜湖成哥 2006-03-02
  • 打赏
  • 举报
回复
是字节对齐,在深入理解计算机系统那本书中说了,WORD两个字节,那么它后面的DWORD 4个字节就要在前面空两个出来,形成DWORD是从4的倍数开始;然后后面的两个WORD分别是两个字节,共4个字节;而最后一个DWORD恰好从4的倍数开始;所以共16个字节了。
jinjiajie 2006-03-02
  • 打赏
  • 举报
回复
字节对齐,编译器设置一下好了...
du51 2006-03-02
  • 打赏
  • 举报
回复
可是为什么sizeof得到的是16个字节

按四个字节读的.不足的补齐.
4*4=16>14
呵呵,刚好.
zez 2006-03-02
  • 打赏
  • 举报
回复
字节对齐...

最最基本的东西了.. 看看书先.. 或者google一下..
就在这里都讨论的百八十遍了...
alen_ghl 2006-03-02
  • 打赏
  • 举报
回复
字节对齐问题(编译器为了提高变量存取速度)
你可以在定义结构体前加上
#pragma pack(push,1) // 一字节对齐
strcut ......
...
#pragma pack(pop)

这样就会就会是你所希望的字节数了
关于字节对齐的具体问题,自己到网上搜索一下,好多
aa3000 2006-03-02
  • 打赏
  • 举报
回复
叫什么位数对齐
du51 2006-03-02
  • 打赏
  • 举报
回复
这个设到2就行了.越小时间越长.
jixingzhong 2006-03-02
  • 打赏
  • 举报
回复
对齐到 1 的话
在程序前使用

#pragma pack(push,1)即可
iamcaicainiao 2006-03-02
  • 打赏
  • 举报
回复
study.
jixingzhong 2006-03-02
  • 打赏
  • 举报
回复
这个是系统默认的情况下的结果,
也有的人希望节省空间,
强制对齐到 1 ,
也就是没有任何的填充,
那么,
结构体的大小就是 14 了 ~
jixingzhong 2006-03-02
  • 打赏
  • 举报
回复
字节对齐:

struct T_BITMAPFILEHEADER { // bmp文件头
WORD bfType; //0到1 两个字节
DWORD bfSize; //由于对齐,从4开始,4.5.6.7四个字节
WORD bfReserved1; //8 .9 两个字节
WORD bfReserved2; //10 . 11两个字节
DWORD bfOffBits; //12 .13 .14. 15 四个字节
}; //共 0 - 15 是16个字节,对齐到 4 (变量align)还是16

所以结果是 16 个字节!!
pagechen 2006-03-02
  • 打赏
  • 举报
回复
为什么有内存对齐?
提高内存读写效率。
现在的memory都有带宽多少位和总线多少位的说法。比如32位系统,硬件设计时为了节约导线,只能按32位的整数倍去选取地址读写,而不能直接读取任意的32位。
就像N个仓库,每个仓库为32个货位。
WORD bf1;
DWORD bf2;
WORD bf3;
WORD bf4;
DWORD bf5;
如何存放?
方案1:把bf1和bf2的前半放在仓库1,bf2后段和bf3方在仓库2 。。。。
方案2:把bf1放在仓库1,bf2放在仓库2,bf3 和bf4放在仓库3。。。。。

现在需要提货bf2,比较两个方案:
1。从仓库1提出一部分,再从仓库2提出另外的部分
2。从仓库2提取

方案2类似于内存对齐到4的情况
逸学堂 2006-03-02
  • 打赏
  • 举报
回复
楼上正解

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧