C语言(打包,压实!)

有个GNU的关键字,出现在了几天前的文章《算法(BMP图像格式处理)》中,当时提了一下,蛋感觉没有敲黑板划重点,很多小朋友估计没咋注意,这就好比衣角的两块钱,平时不起眼,不在意,不爱她,万一外出没车没人没带包,只能坐公交,两块零钱可是回家的救命稻草。

这个GNU关键字是:__attribute__((packed()))

上次是怎么用他的来着?想起来了,就是当我们定义一个结构体,来存储BMP格式头数据信息的时候,比如:

struct header { int16_t type; int32_t size; int16_t reserved1; int16_t reserved2; int32_t offbits; }__attribute__((packed));

如果定义该结构体的时候,不使用packed关键字,那么系统将会根据CPU字长将结构体内部的各个成员的地址对齐,地址对齐的结果会导致有些成员变量的后面需要填补一些0,也就是说:结构体的总大小,可能会大于每一个成员的大小之和。

这个过程就好比顺丰快递员打包包裹,当你寄送的东东无法刚刚好填满整个箱子的时候,他为了防止运送过程中的震荡损坏物件,会塞一些泡沫、空气囊等填充物进去一样。

为了这个我还专门p了个图,呐,就像这样子:

这个填充一些东西的做法,一般情况下都是好的,在移植类代码中甚至是必须的。但是如果你想要让结构体的大小严格等于每个成员之和,就不能这么做了,而必须加上 __attribute__((packed))。就像读取BMP文件的格式头的例子,如果没使用这个关键字,你将会读到比所实际所需的更多的字节,结果当然就不对了。

关键是以上错误非常隐蔽,如果老师傅不说破,小学徒是不是要跑断腿?

对了,说话快递空气缓冲袋哪家强? 我只信浦帝空气袋,什么?哪里有得买?戳这里就可以了:https://detail.tmall.com/item.htm?spm=a220m.1000858.0.0.yTWPyu&id=538902580360&areaId=440100&is_b=1&cat_id=2&q=%BB%BA%B3%E5%B4%FC

链接点不进去? 哈哈哈很正常。没听过微信还会给阿里开放接口的。真要买的话,直接上天猫搜索浦帝,或者直接点击左下角“阅读原文”即可!!!但话说回来,你买空气袋做什么???

原文发布于微信公众号 - 秘籍酷(mijiku040)

原文发表时间:2019-05-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券