国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

對結(jié)構(gòu)體的對齊理解上有點偏差

冬至配餃子 ? 來源:最后一個bug ? 作者:bug菌 ? 2022-08-10 18:08 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

最近看到一些朋友在交流結(jié)構(gòu)體對齊方面的一些問題,從他們的交談中隱隱約感覺有幾個朋友對結(jié)構(gòu)體成員的對齊理解上有點偏差,不能說完全不對吧,畢竟這是老生常談的問題了~

1、變量與內(nèi)存

首先我們要明確,在嵌入式C語言中變量是什么?其實所謂的變量就是一小段內(nèi)存。

當你隨心所欲的在C程序中定義著各種變量,有沒有想過他們是如何被安排到相應(yīng)內(nèi)存上的?

好吧,其實他們是怎么安排的,并不需要程序員太多的操心,這個映射過程都是編譯器自動給大家分配的,(可以借助動態(tài)內(nèi)存的角度去看待這個分配問題),因為大部分變量在一定內(nèi)存區(qū)域上是可以任意選擇地址的,比如你定義一個全局的int gVar 變量,在不進行特殊指定內(nèi)存位置的情況下,其編譯后所分配的內(nèi)存地址并不一定每次都是相同的;當然,每次編譯完成便會確定下來,并且程序中對該變量的訪問,均會使用所確定下來的內(nèi)存地址。

既然變量的地址分配過程由編譯器自動完成,但有時候我們想把一些或者某個變量放在固定的內(nèi)存地址處等,此時就需要通過一些語法來告訴編譯器該如何分配這些指定變量內(nèi)存的分配,比如要做復位數(shù)據(jù)恢復等。

然而內(nèi)存的對齊問題也是對這些變量分配位置處理的一種方式,通常我們看到的align或者pack等就是來干預編譯器的這塊處理的。

2、結(jié)構(gòu)體對齊

理解了上面的一個思路,那么我們來分析分析結(jié)構(gòu)體對齊問題。

參考demo:

pYYBAGLzgjeAT8iJAAD1H7F0bjk340.pngpYYBAGLzgj2ARVKUAAC0Xb725aI681.png

運行結(jié)果:

poYBAGLzglmACdHRAAAwvobA02U713.png

以上編譯結(jié)果采用的是32位編譯器,默認對齊方式是4個字節(jié),char類型占據(jù)1個字節(jié),int占據(jù)4個字節(jié),

下面簡單分析一下結(jié)果:

1、默認方式,采用4個字節(jié)對齊,那么char后面需要填充3個字節(jié),然后存放int類型,所以結(jié)構(gòu)體大小輸出為8。

2、1字節(jié)對齊方式,直接緊湊排列,很多人也叫不進行對齊處理,所以輸出結(jié)果是5。

3、2字節(jié)對齊方式,其實和4個字節(jié)對齊是類似的,char按照2字節(jié)對齊,所以后面需要填充一個字節(jié),這樣int才能以兩字節(jié)對齊排布,此時整個結(jié)構(gòu)體占據(jù)6個字節(jié)。

4、4字節(jié)對齊方式與默認對齊方式一致,最后看看8字節(jié)對齊,此時char類型與int類型完全能夠被8個字節(jié)容納,而該結(jié)構(gòu)體最大數(shù)據(jù)類型是4個字節(jié),所以char后面會預留3個字節(jié),進行4字節(jié)對齊,然后放置int類型,此時與4字節(jié)對齊是一致的。那么一些朋友會問,是不是在上面的8字節(jié)例子中再加入一個char類型的成員,整個結(jié)構(gòu)體就會占據(jù)16個字節(jié)了呢?

pYYBAGLzgnOAR4kbAAA_oPyNI74889.png

其輸出結(jié)果如下:

pYYBAGLzgpSARzfuAAAupVKITM0562.png

結(jié)構(gòu)體所占據(jù)的字節(jié)是12個,那是不是認為8字節(jié)對齊沒有意義呢?我們再看一個實驗:

poYBAGLzgqeAFrKaAABIrxc_Zj4505.png

此時double占據(jù)了8個字節(jié),按照前面的思路應(yīng)該是4+8+4,應(yīng)該最終結(jié)構(gòu)體的大小是16個字節(jié),而結(jié)果顯示:

poYBAGLzgr6ABA9MAAAtrVniz38521.png

輸出結(jié)果顯示24=8+8+8的形式,大家也可以直接采用打印結(jié)構(gòu)體成員地址的辦法查看是幾個字節(jié)對齊,有點暈,到底編譯器這一塊是怎么處理的呢?結(jié)論是:對齊字節(jié)數(shù) = min<當前指定的pack值,最大成員所占字節(jié)大小>。

很多朋友其實研究到這個階段基本上就沒有再繼續(xù)探究了~嵌入式C語言一定要跟硬件結(jié)合理解~

3、內(nèi)存對齊

其實所謂的結(jié)構(gòu)體對齊,并不是簡單的1個字節(jié)、兩個字節(jié)等多個字節(jié)的排列組合,而是在對應(yīng)對齊地址上分布。首先對齊需要解決的問題是什么 ? 即為啥需要對齊?

提高內(nèi)存的訪問效率,也可以說是受CPU等硬件方面的限制,按照特定的對齊地址進行數(shù)據(jù)的訪問要快于跨非對齊地址的內(nèi)存訪問;并且有些平臺僅支持對齊方式訪問,非對齊方式會直接運行錯誤。

poYBAGLzgteADWrAAABvtqExg18425.png

為了加快相關(guān)數(shù)據(jù)的正確訪問,編譯器會把相關(guān)的變量盡量的放到對齊的地址上,也就是默認的對齊方式,比如CPU在偶數(shù)地址上訪問比較快,那么就會采用2個字節(jié)對齊的方式。
所以結(jié)構(gòu)體內(nèi)部成員并不是簡單成員字節(jié)個數(shù)的對齊拼湊,而是讓結(jié)構(gòu)體成員落在對齊的地址上以便訪問。如下圖所示,當進行2字節(jié)對齊,如果只是簡單的拼湊,兩種分布都是可以的,但是左側(cè)才是正確的2字節(jié)對齊方式,char成員變量的地址是2,int變量的地址是4,均為2字節(jié)的倍數(shù)。

pYYBAGLzgu6AXO9DAABqWWJvUDc646.png

總結(jié)一下: 結(jié)構(gòu)體對齊不再是簡單的字節(jié)個數(shù)的拼湊,而是要與內(nèi)存地址進行掛鉤~一般我們也可以理解為內(nèi)存地址分配是多少字節(jié)的倍數(shù),就是多少直接對齊~


審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5198

    文章

    20449

    瀏覽量

    334051
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11279

    瀏覽量

    224988
  • C語言
    +關(guān)注

    關(guān)注

    183

    文章

    7644

    瀏覽量

    145598
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1672

    瀏覽量

    51610
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    10個例子代碼,C語言結(jié)構(gòu)的高級

    當涉及到C語言結(jié)構(gòu)的高級**時,有很多有趣和強大的技巧可以應(yīng)用。下面是10個例子代碼,每個例子都使用了不同的高級結(jié)構(gòu)技術(shù),包括位字段、嵌套結(jié)構(gòu)
    發(fā)表于 01-05 06:32

    一個經(jīng)典的結(jié)構(gòu)和聯(lián)合體共用的實例

    結(jié)構(gòu) 結(jié)構(gòu)占用的內(nèi)存大小,首先和編譯器的系統(tǒng)位數(shù)有關(guān)系,類似于CPU是 64 bits 還是 32 bits 的情形;其次,結(jié)構(gòu)
    發(fā)表于 12-16 07:14

    結(jié)構(gòu)聲明與定義

    1、聲明 結(jié)構(gòu)的聲明使用struct關(guān)鍵字,如果我們想要把我們的學籍信息組織一下的話,可以這樣表示: struct Info { unsigned long identifier;//學號
    發(fā)表于 12-11 07:52

    typedef結(jié)構(gòu)使用

    雖然結(jié)構(gòu)的出現(xiàn)能夠讓我們有一個更科學的數(shù)據(jù)結(jié)構(gòu)來管理數(shù)據(jù),但是每次使用結(jié)構(gòu)都需要struct...,未免顯得有些冗長和麻煩。有了type
    發(fā)表于 12-08 07:04

    共用聲明

    共用也稱聯(lián)合體。 和結(jié)構(gòu)還是有點像: union 共用名稱 { 成員1; 成員2; 成員3; }; 但是兩者有本質(zhì)的不
    發(fā)表于 12-05 07:24

    為什么不建議用匿名結(jié)構(gòu)

    說起匿名結(jié)構(gòu),想必大家第一感覺就是看著好高大上的名字,但實際上也就那樣。 typedef struct { union { struct { uint8_t bit_0:1
    發(fā)表于 12-04 07:39

    C語言結(jié)構(gòu)使用

    有時候需要將不同類型的數(shù)據(jù)組合為一個整體,以便于引用。例如,一名學生有學號、姓名、性別、年齡等屬性,如果針對每個屬性都單獨定義一個變量,那么當有多名學生時變量就難以分清。結(jié)構(gòu)就是用來管理不同類
    發(fā)表于 11-12 08:30

    電能質(zhì)量在線監(jiān)測裝置能測頻率偏差嗎?

    電能質(zhì)量在線監(jiān)測裝置 能測量頻率偏差 ,且頻率偏差是其核心監(jiān)測指標之一,需符合《GB/T 15945-2017 電能質(zhì)量 電力系統(tǒng)頻率偏差》等國家標準,可實時跟蹤電網(wǎng)基波頻率(如 50Hz/60Hz
    的頭像 發(fā)表于 10-13 17:48 ?972次閱讀

    定義IO初始化結(jié)構(gòu)

    由上述IOPORT相關(guān)功能的枚舉類型我們可以知道,在對IOPORT模塊進行初始化時需要根據(jù)情況配置它們。因此我們定義一個IOPORT初始化的結(jié)構(gòu)類型IOPORT_Init_t,它的成員包括了由上述所有枚舉類型所聲明的變量,因此該結(jié)構(gòu)
    的頭像 發(fā)表于 07-16 16:26 ?1410次閱讀

    滲壓計在混凝土結(jié)構(gòu)中的安裝指南

    在現(xiàn)代土木工程和巖土工程中,滲壓計是監(jiān)測混凝土結(jié)構(gòu)體內(nèi)孔隙水壓力變化的重要工具。南京峟思公司生產(chǎn)的滲壓計因其高精度和可靠性而被廣泛應(yīng)用于各種工程監(jiān)測項目中。一、滲壓計在混凝土結(jié)構(gòu)中的應(yīng)用價值滲壓計
    的頭像 發(fā)表于 05-28 10:55 ?599次閱讀
    滲壓計在混凝土<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>中的安裝指南

    GLAD應(yīng)用:全息光柵模擬

    用于模擬全息記錄介質(zhì)中形成的梯度折射率分布。全息結(jié)構(gòu)一旦形成,就可以在傳輸過程中將一束入射光波逐漸轉(zhuǎn)換成形成體全息結(jié)構(gòu)的另一束光波。兩束光波之間的能量傳遞轉(zhuǎn)換效率與全息
    發(fā)表于 05-15 09:32

    Allegro Skill布局功能--器件絲印過孔對齊介紹與演示

    Allegro系統(tǒng)雖然提供了基本的元件對齊功能,但其適用范圍較為有限。相比之下,F(xiàn)anyskill 的“對齊”命令在操作體驗和功能性上更具優(yōu)勢:其界面設(shè)計更加直觀易用,并支持多種元素的對齊操作,包括
    發(fā)表于 05-14 08:59 ?3697次閱讀
    Allegro Skill布局功能--器件絲印過孔<b class='flag-5'>對齊</b>介紹與演示

    C語言中結(jié)構(gòu)與聯(lián)合體的深度解析:內(nèi)存布局與應(yīng)用場景

    一、基礎(chǔ)概念與核心差異 1.1 結(jié)構(gòu)(Struct)的本質(zhì) **結(jié)構(gòu)是C語言中實現(xiàn)數(shù)據(jù)封裝的基石,其核心特征在于內(nèi)存獨立性。每個成員變量在內(nèi)存中按聲明順序依次排列,形成連續(xù)的內(nèi)存塊
    發(fā)表于 04-08 09:18

    圖解邊沿對齊,中心對齊PWM(可下載)

    在說邊沿對齊,中心對齊前,我們先來段鋪墊,PWM 又稱脈沖寬度調(diào)制,我們通過調(diào) 節(jié)脈沖的占空比,我們可以控制電壓的大小(比如我們滿占空比時電壓為 12V,我們可以通 過調(diào)節(jié)占空比讓電壓變?yōu)?7V
    發(fā)表于 03-31 15:15 ?1次下載

    一種基于基礎(chǔ)模型對齊的自監(jiān)督三維空間理解方法

    三維空間理解是推動自動駕駛、具身智能等領(lǐng)域中智能系統(tǒng)實現(xiàn)環(huán)境感知、交互的核心任務(wù),其中3D語義占據(jù)預測 (Semantic Occupancy Prediction) 對三維場景進行精準的素級建模。然而,當前主流方法嚴重依賴大規(guī)模標注數(shù)據(jù),制約了模型的可擴展性和泛化能力
    的頭像 發(fā)表于 03-18 15:01 ?973次閱讀
    一種基于基礎(chǔ)模型<b class='flag-5'>對齊</b>的自監(jiān)督三維空間<b class='flag-5'>理解</b>方法