的union_C语言“隐秘的角落”——union没那么简单
寫在前面:此文將摘錄C語言中容易被忽視的一些知識,并且加以思考為什么要那么做。
它可以存在的道理是:所有語言或多或少都有共同點,舉一反三或許可以得到的更多。
我將以tip 1,2,3 當做標識持續更新下去,感興趣的可以關注+收藏,謝謝。PS: 雙擊屏幕可以使自己更專心哦,下面開始咯。
公眾號: 黃桃罐頭與蜘蛛 寫一寫可愛的事物為什么是黃桃罐頭與蜘蛛??mp.weixin.qq.comTip3: union沒那么簡單
你會在什么時候使用union?先看一個簡單的例子:
由于在嵌入式固件中,大多數都需要對byte單位的數據進行處理。
比如lcd的刷屏。
以上的圖片就是為了對8bit圖片進行處理而定義的聯合數據結構。
具體的邏輯是:
這體現了union的第一個作用:
節省了內存空間和轉換的代碼量。
這同時也是我們最常用的union的方法。
還比如,ble傳輸的時間數據用聯合,按照傳輸協議的順序,可以直接得到年月日小時以及分鐘,等等。
可是,union有時候也顯得很高級。
而這,正是我今天想說的。
按照慣例:
這是用到聯合定義的單鏈表結構。
這個好像看起來有點復雜,那么先來看看它的原型。
這下子是不是豁然開朗。
這兩個定義其實都是對單鏈表的定義,只不過第一個將單鏈表做了強制的對齊,按照的是Int類型。
下面先分析代碼:
這里的聯合就是將這個結構和Int類型做了一個聯合。
根據聯合的定義:
所以,當我們用這樣一個union過后,我們就不用擔心我們如何去初始化我們的鏈表了,因為它將是永遠的四字節對齊(有些機器是2/8字節,不用管),同時將避免一些我們難以預料到的bug。
對,這就是我們的目的:
利用語言和語句的特性來進行我們代碼的優化以及提高系統的魯棒性。其實,我也是很難注意到這些的。
但是在嵌入式系統軟件的開發中,你不得不對“對齊”這個詞語另眼相看。
因為,如果你不重視它,它會隱藏起來,然后在不期然的時候給你迎頭重擊。
曾經有一個項目,其中reouce的資源是用結構體定義的多維數組,在利用這個resource的時候,進行指針的強制轉換,結果因為結構體的定義不是四字節對齊,導致了系統重啟,最后花了很多時間才找到這個問題所在。
后來,利用關鍵字attribute解決了。
但是現在想起來,這也是可以用union來解決的。
思考:今天的思考想說點題外話。
比如,三國殺。
我曾經是一個三國殺3V3重度玩家。
三國殺3V3和身份局是截然不同的兩個游戲,它不光考驗你對武將的熟悉度以及對游戲的熟悉度,它其實更多考量的是對這個游戲勝利條件的思考。
有的時候,當選將結束的時候,游戲就已經結束了,勝利女神只會青睞動腦筋的玩家。
比如:
鄧艾在身份局是一個弱將,他可能在只有當內奸的時候才有可發揮的空間。
可他在33中有時候對于局勢卻有巨大的影響力。
這就和他本來的特性相關: 在回合外失去牌可以屯田,當屯田達到3張可以覺醒,并且成為了一個強將。
他和王異的配合,和孫堅的配合,都使它可以快速覺醒,最終影響勝利的天平。
這和今天union這個例子有一些地方不謀而合。
在嵌入式中,系統的穩定性是非常非常重要的,你不光要考慮軟件,還要考慮硬件,CPU有些是4字節的讀取,那么4字節對齊將變得很重要,在結構體的定義上就需要考量這些因素。
而union的特性在這種情況下就可以大展拳腳,起到一勞永逸的作用通透地了解一件事物或一個人,那么幾乎沒有什么是無用的。“天生我才必有用”——有時候也可以這么理解。
總結
以上是生活随笔為你收集整理的的union_C语言“隐秘的角落”——union没那么简单的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 西餐餐具15种名称配图
- 下一篇: 97年的一百港币等于多少人民币(一百元人