日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2024/9/18 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 的union_C语言“隐秘的角落”——union没那么简单 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

寫在前面:此文將摘錄C語言中容易被忽視的一些知識,并且加以思考為什么要那么做。

它可以存在的道理是:所有語言或多或少都有共同點,舉一反三或許可以得到的更多。

我將以tip 1,2,3 當做標識持續(xù)更新下去,感興趣的可以關注+收藏,謝謝。

PS: 雙擊屏幕可以使自己更專心哦,下面開始咯。

公眾號: 黃桃罐頭與蜘蛛 寫一寫可愛的事物為什么是黃桃罐頭與蜘蛛??mp.weixin.qq.com

Tip3: union沒那么簡單

你會在什么時候使用union?

先看一個簡單的例子:

由于在嵌入式固件中,大多數(shù)都需要對byte單位的數(shù)據(jù)進行處理。

比如lcd的刷屏。

以上的圖片就是為了對8bit圖片進行處理而定義的聯(lián)合數(shù)據(jù)結構。

具體的邏輯是:

  • 通過spi或者其他傳輸協(xié)議讀取flash中存儲的數(shù)據(jù),以byte為單位。
  • 由于是8bit的圖片,這個圖片的head將是一個16bit的索引,也就是調色板(具體這些定義可以自行查找rgb以及bmp的資料),它將和具體的索引值一起存在以上g_color__table中。
  • 處理調色板數(shù)據(jù)的時候直接用這個union.color_tab。
  • 這體現(xiàn)了union的第一個作用:

    節(jié)省了內(nèi)存空間和轉換的代碼量。

    這同時也是我們最常用的union的方法。

    還比如,ble傳輸?shù)臅r間數(shù)據(jù)用聯(lián)合,按照傳輸協(xié)議的順序,可以直接得到年月日小時以及分鐘,等等。

    可是,union有時候也顯得很高級。

    而這,正是我今天想說的。

    按照慣例:

    這是用到聯(lián)合定義的單鏈表結構。

    這個好像看起來有點復雜,那么先來看看它的原型。

    這下子是不是豁然開朗。

    這兩個定義其實都是對單鏈表的定義,只不過第一個將單鏈表做了強制的對齊,按照的是Int類型。

    下面先分析代碼:

    這里的聯(lián)合就是將這個結構和Int類型做了一個聯(lián)合。

    根據(jù)聯(lián)合的定義:

  • 聯(lián)合定義的最大空間是它的成員最大的那個變量定義。
  • 它將保證對最小成員的類型進行強制的對齊。
  • 所以,當我們用這樣一個union過后,我們就不用擔心我們?nèi)绾稳コ跏蓟覀兊逆湵砹?#xff0c;因為它將是永遠的四字節(jié)對齊(有些機器是2/8字節(jié),不用管),同時將避免一些我們難以預料到的bug。

    對,這就是我們的目的:

    利用語言和語句的特性來進行我們代碼的優(yōu)化以及提高系統(tǒng)的魯棒性。

    其實,我也是很難注意到這些的。

    但是在嵌入式系統(tǒng)軟件的開發(fā)中,你不得不對“對齊”這個詞語另眼相看。

    因為,如果你不重視它,它會隱藏起來,然后在不期然的時候給你迎頭重擊。

    曾經(jīng)有一個項目,其中reouce的資源是用結構體定義的多維數(shù)組,在利用這個resource的時候,進行指針的強制轉換,結果因為結構體的定義不是四字節(jié)對齊,導致了系統(tǒng)重啟,最后花了很多時間才找到這個問題所在。

    后來,利用關鍵字attribute解決了。

    但是現(xiàn)在想起來,這也是可以用union來解決的。

    思考:
    今天的思考想說點題外話。
    比如,三國殺。
    我曾經(jīng)是一個三國殺3V3重度玩家。
    三國殺3V3和身份局是截然不同的兩個游戲,它不光考驗你對武將的熟悉度以及對游戲的熟悉度,它其實更多考量的是對這個游戲勝利條件的思考。
    有的時候,當選將結束的時候,游戲就已經(jīng)結束了,勝利女神只會青睞動腦筋的玩家。
    比如:
    鄧艾在身份局是一個弱將,他可能在只有當內(nèi)奸的時候才有可發(fā)揮的空間。
    可他在33中有時候對于局勢卻有巨大的影響力。
    這就和他本來的特性相關: 在回合外失去牌可以屯田,當屯田達到3張可以覺醒,并且成為了一個強將。
    他和王異的配合,和孫堅的配合,都使它可以快速覺醒,最終影響勝利的天平。
    這和今天union這個例子有一些地方不謀而合。
    在嵌入式中,系統(tǒng)的穩(wěn)定性是非常非常重要的,你不光要考慮軟件,還要考慮硬件,CPU有些是4字節(jié)的讀取,那么4字節(jié)對齊將變得很重要,在結構體的定義上就需要考量這些因素。
    而union的特性在這種情況下就可以大展拳腳,起到一勞永逸的作用通透地了解一件事物或一個人,那么幾乎沒有什么是無用的。“天生我才必有用”——有時候也可以這么理解。

    總結

    以上是生活随笔為你收集整理的的union_C语言“隐秘的角落”——union没那么简单的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。