写在前面:此文将摘录C语言中容易被忽视的一些知识,并且加以思考为什么要那么做。

它可以存在的道理是:所有语言或多或少都有共同点,举一反三或许可以得到的更多。

我将以tip 1,2,3 当做标识持续更新下去,感兴趣的可以关注+收藏,谢谢。

PS: 双击屏幕可以使自己更专心哦,下面开始咯。

公众号: 黄桃罐头与蜘蛛 写一写可爱的事物

为什么是黄桃罐头与蜘蛛?​mp.weixin.qq.com

Tip3: union没那么简单

你会在什么时候使用union?

先看一个简单的例子:

由于在嵌入式固件中,大多数都需要对byte单位的数据进行处理。

比如lcd的刷屏。

以上的图片就是为了对8bit图片进行处理而定义的联合数据结构。

具体的逻辑是:

  1. 通过spi或者其他传输协议读取flash中存储的数据,以byte为单位。
  2. 由于是8bit的图片,这个图片的head将是一个16bit的索引,也就是调色板(具体这些定义可以自行查找rgb以及bmp的资料),它将和具体的索引值一起存在以上g_color__table中。
  3. 处理调色板数据的时候直接用这个union.color_tab。

这体现了union的第一个作用:

节省了内存空间和转换的代码量。

这同时也是我们最常用的union的方法。

还比如,ble传输的时间数据用联合,按照传输协议的顺序,可以直接得到年月日小时以及分钟,等等。

可是,union有时候也显得很高级。

而这,正是我今天想说的。

按照惯例:

这是用到联合定义的单链表结构。

这个好像看起来有点复杂,那么先来看看它的原型。

这下子是不是豁然开朗。

这两个定义其实都是对单链表的定义,只不过第一个将单链表做了强制的对齐,按照的是Int类型。

下面先分析代码:

这里的联合就是将这个结构和Int类型做了一个联合。

根据联合的定义:

  1. 联合定义的最大空间是它的成员最大的那个变量定义。
  2. 它将保证对最小成员的类型进行强制的对齐。

所以,当我们用这样一个union过后,我们就不用担心我们如何去初始化我们的链表了,因为它将是永远的四字节对齐(有些机器是2/8字节,不用管),同时将避免一些我们难以预料到的bug。

对,这就是我们的目的:

利用语言和语句的特性来进行我们代码的优化以及提高系统的鲁棒性。

其实,我也是很难注意到这些的。

但是在嵌入式系统软件的开发中,你不得不对“对齐”这个词语另眼相看。

因为,如果你不重视它,它会隐藏起来,然后在不期然的时候给你迎头重击。

曾经有一个项目,其中reouce的资源是用结构体定义的多维数组,在利用这个resource的时候,进行指针的强制转换,结果因为结构体的定义不是四字节对齐,导致了系统重启,最后花了很多时间才找到这个问题所在。

后来,利用关键字attribute解决了。

但是现在想起来,这也是可以用union来解决的。

思考:
今天的思考想说点题外话。
比如,三国杀。
我曾经是一个三国杀3V3重度玩家。
三国杀3V3和身份局是截然不同的两个游戏,它不光考验你对武将的熟悉度以及对游戏的熟悉度,它其实更多考量的是对这个游戏胜利条件的思考。
有的时候,当选将结束的时候,游戏就已经结束了,胜利女神只会青睐动脑筋的玩家。
比如:
邓艾在身份局是一个弱将,他可能在只有当内奸的时候才有可发挥的空间。
可他在33中有时候对于局势却有巨大的影响力。
这就和他本来的特性相关: 在回合外失去牌可以屯田,当屯田达到3张可以觉醒,并且成为了一个强将。
他和王异的配合,和孙坚的配合,都使它可以快速觉醒,最终影响胜利的天平。
这和今天union这个例子有一些地方不谋而合。
在嵌入式中,系统的稳定性是非常非常重要的,你不光要考虑软件,还要考虑硬件,CPU有些是4字节的读取,那么4字节对齐将变得很重要,在结构体的定义上就需要考量这些因素。
而union的特性在这种情况下就可以大展拳脚,起到一劳永逸的作用通透地了解一件事物或一个人,那么几乎没有什么是无用的。“天生我才必有用”——有时候也可以这么理解。

的union_C语言“隐秘的角落”——union没那么简单相关推荐

  1. Python数据分析——《隐秘的角落》开播之后就没下过热搜?

    不会吧.不会吧,不会还有朋友没看<隐秘的角落>吧,如果没有断网的话,最近朋友圈.微博等都应该被这部只有十二集的国产网剧刷屏了.开播初豆瓣评分就已经达到9.0,甚至一度窜到9.2,要知道国产 ...

  2. wgs84坐标格式转换度分秒_一起爬山吗?寻找GIS坐标系统中“隐秘的角落”

    随着网剧<隐秘的角落>的爆红,笛卡尔与他的心形线的传说再次重回大众视野,r=a(1-sinθ) 就是"心形线"方程式. 笛卡尔法国著名数学家,哲学家,创建了数学坐标系, ...

  3. 看了《隐秘的角落》才知道,掉头发有多可怕!10个掉头发最快的专业!快看看你中枪了没有!...

    全世界只有3.14 % 的人关注了 爆炸吧知识 专业选得好 秃头秃得早 我爱学习,学习使我快乐 我爱学习,学习使我进步 我爱学习,学习使我美丽 学习:我TM还能使你脱发呢 我: 港真 现在上个大学 不 ...

  4. Python 爬取 201865 条《隐秘的角落》弹幕,发现看剧不如爬山?

    作者 | 朱小五 责编 | 屠敏 封图 | CSDN 付费下载自东方 IC 最近又火了一部国产剧:<隐秘的角落>. 如果你没看过,那可能会对朋友圈里大家说的"一起去爬山" ...

  5. 数据扒一扒《隐秘的角落》到底怎么火的?

    6月25日,端午节这天,豆瓣9.0高分网剧<隐秘的角落>迎来了大结局. 追完剧的章子怡也在微博上鼎力推荐:"看了这么多年的美剧英剧,终于有一部品质可与其抗衡的'中剧'了!< ...

  6. Python爬取并分析 201865 条《隐秘的角落》弹幕

    最近又火了一部国产剧:<隐秘的角落> 如果你没看过,那可能会对朋友圈里大家说的"一起去爬山"."小白船"."还有机会吗"感到莫名 ...

  7. 如何让《隐秘的角落》快速大结局?只需要一份保险......

    学姐最近追了一部火爆的网剧<隐秘的角落>,豆瓣评分高达8.9分. 说实话,学姐已经很长时间没有看到制作这么精良的国产剧了.背景音乐配上剧情,太震撼了.到现在,学姐脑海中还时不时地响起&qu ...

  8. 我看过《隐秘的角落》才知道,理科生有多可怕!

    全世界只有3.14 % 的人关注了 爆炸吧知识 最近,大家都被<隐秘的角落>刷屏了吧? 但吃瓜.看瓜的背后,我看到了理科生的可怕之处. 数学课上,为了暗示朱朝阳自己杀人其实是因为被背叛,张 ...

  9. 《隐秘的角落》里笛卡尔的爱情故事,是真的吗?

    作者 | matrix67 编辑 | 大琳砸 出处 | 果壳(Guokr42) 在这个距离各种情人节都很遥远的日子里,伴随着网剧<隐秘的角落>的热播,数学家笛卡尔和他的心形线传说又一次重回 ...

最新文章

  1. gitter 卸载_最佳Gitter频道:Scala
  2. centos下配置nginx支持php
  3. 从机器学习谈起(机器学习简介)
  4. markdown软件_实用软件推荐|Markdown文本编辑器之Typora
  5. Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (4)
  6. 学计算机与学英语作文,初二英语作文(关于计算机与学习)
  7. IDEA一定要改的8条配置
  8. 设计灵感合集|拟人化创意合成小动物,治愈可爱风插画作品
  9. 两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载
  10. java jama_java矩阵包jama的简单操作
  11. Linux串口终端驱动——S3C6410平台
  12. 信息学奥赛之数学一本通 pdf_整理青少年信息奥赛
  13. ionCube 安装
  14. python数据可视化方法和库
  15. 撸完这篇线程池,我快咳血了!
  16. 前端开发:Vue项目中解决Emitted value instead of an instance of Error问题
  17. 外来常驻人员使用计算机,在计算机终端上插入外来移动存储介质时,最合理的做法应该是()...
  18. 一点一点解读紫书中例子--大整数类BigInteger (1)
  19. 如何理解MPC模型预测控制理论
  20. # 关于Qt程序异常结束, The process was ended forcefully问题

热门文章

  1. 使用Gitblit 搭建Windows Git服务器
  2. php发送get、post请求获取内容的几种方法
  3. 微信小程序——真机调试方法(vConsole)
  4. java发送http请求的四种方式
  5. 区分柱状图(条形图)和直方图
  6. xhprof在windows下面的安装和使用[上](windows版本)
  7. 体验XHProf(linux版本)
  8. 程序员获取编程灵感的 10 种方式
  9. PHP设计模式:工厂(静态方法里调用newobj的方法)单例(三私一公newself)注册树(使用静态变量数组存取对象)适配器(主体建立接口适配器丰富方法)
  10. 北风网php笔记正则表达式,PHP中使用正则表达式提取中文实现笔记