[ZLG-ARM] 请教一个老问题:关于sizeof准确计算结构长度

[复制链接]
2890|8
 楼主| lw2008 发表于 2007-7-5 10:36 | 显示全部楼层 |阅读模式
struct&nbsp;sFrz_Adr_Tbl9&nbsp;&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;uint8&nbsp;Buf[11];<br />&nbsp;&nbsp;&nbsp;struct&nbsp;<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;&nbsp;b;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;c;<br />&nbsp;&nbsp;&nbsp;&nbsp;}sTbl2;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;uChkSum;&nbsp;&nbsp;&nbsp;//&nbsp;校验和<br />};<br /><br />sizeof(sAdrTbl9)为18字节,实际为15<br /><br />--------------------------------------------------<br />struct&nbsp;sFrz_Adr_Tbl9<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;Buf[12];<br />&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;&nbsp;b[2];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;c;<br />&nbsp;&nbsp;&nbsp;&nbsp;}sTbl2;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;uChkSum[2];&nbsp;&nbsp;&nbsp;//&nbsp;校验和<br />};<br /><br />sizeof(sAdrTbl9)为18字节,实际为18<br /><br />--------------------------------------------------<br />好像字节要偶数地址对准,这对于修改中的大型结构体来说人工校准量太大了,也易出错。<br />ADS中选的小端对齐,LPC2138。
 楼主| lw2008 发表于 2007-7-5 10:48 | 显示全部楼层

简化了一下

struct&nbsp;sFrz_Adr_Tbl7&nbsp;&nbsp;&nbsp;//&nbsp;sizeof为7,实为7<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;Buf[5];&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;uChkSum[2];<br />};<br /><br />struct&nbsp;sFrz_Adr_Tbl8&nbsp;&nbsp;&nbsp;//&nbsp;sizeof为8,实为7<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;Buf[5];&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;uChkSum;<br />};<br /><br />struct&nbsp;sFrz_Adr_Tbl9&nbsp;&nbsp;&nbsp;//&nbsp;sizeof为8,实为5<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;Buf[1];&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;uChkSum;<br />};<br /><br />只要有非uint8加入结构,就会出现该问题。
alin_99 发表于 2007-7-5 10:53 | 显示全部楼层

注意 要 凑4的整数倍,合理安排存储顺序啊

  
ayb_ice 发表于 2007-7-5 13:17 | 显示全部楼层

这和CPU有关,不会错的...

  
lenglx 发表于 2007-7-5 14:06 | 显示全部楼层

#pragma&nbsp;pack(1)<br />....<br />#pragma&nbsp;pack()
ayb_ice 发表于 2007-7-5 15:16 | 显示全部楼层

随便说说

有些编译器会插入补丁,以便对齐,实际是和内核有关,因为有些内核只能访问<br />对齐的地址...
 楼主| lw2008 发表于 2007-7-6 18:31 | 显示全部楼层

TO:lenglx

<br />这是标准编译命令吧。<br /><br />#pragma&nbsp;pack(1)<br />....<br />#pragma&nbsp;pack()<br /><br />
cszhaoqm 发表于 2007-7-7 00:51 | 显示全部楼层

搜索一下"字节对齐",对理解这个问题有帮助!

  
veryfatman 发表于 2007-8-2 08:59 | 显示全部楼层

vc

试验了一下,在vc里,struct&nbsp;member&nbsp;alignment规定的是最大对齐字节数。<br /><br />和不同的数据类型有关。<br /><br />例如设置alignment为4,则double按4字节对齐,char仍按2字节对齐。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

296

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部