chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

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

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

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

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

參考demo:

pYYBAGLzgjeAT8iJAAD1H7F0bjk340.pngpYYBAGLzgj2ARVKUAAC0Xb725aI681.png

運(yùn)行結(jié)果:

poYBAGLzglmACdHRAAAwvobA02U713.png

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

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

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

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

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

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

pYYBAGLzgnOAR4kbAAA_oPyNI74889.png

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

pYYBAGLzgpSARzfuAAAupVKITM0562.png

結(jié)構(gòu)體所占據(jù)的字節(jié)是12個(gè),那是不是認(rèn)為8字節(jié)對(duì)齊沒(méi)有意義呢?我們?cè)倏匆粋€(gè)實(shí)驗(yàn):

poYBAGLzgqeAFrKaAABIrxc_Zj4505.png

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

poYBAGLzgr6ABA9MAAAtrVniz38521.png

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

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

3、內(nèi)存對(duì)齊

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

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

poYBAGLzgteADWrAAABvtqExg18425.png

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

pYYBAGLzgu6AXO9DAABqWWJvUDc646.png

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


審核編輯:劉清

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

    關(guān)注

    5186

    文章

    20133

    瀏覽量

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

    關(guān)注

    68

    文章

    11213

    瀏覽量

    222769
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    183

    文章

    7642

    瀏覽量

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

    關(guān)注

    1

    文章

    1669

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    C語(yǔ)言的編程技巧

    1、宏定義使用do{...}while(0)?:當(dāng)宏定義中包含多條語(yǔ)句時(shí),使用do{...}while(0)可以避免語(yǔ)句嵌套問(wèn)題,確保宏的獨(dú)立性。? ?2、靈活數(shù)組成員?:C99標(biāo)準(zhǔn)允許結(jié)構(gòu)的最后
    發(fā)表于 11-27 06:46

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

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

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

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

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

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

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

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

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

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

    Allegro Skill布局功能--器件絲印過(guò)孔對(duì)齊介紹與演示

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

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

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

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

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

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

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

    晶振的頻率偏差與解決方法

    晶振是一種常用的頻率標(biāo)準(zhǔn)元件,在電子電路中具有重要的作用。然而,在實(shí)際使用中,晶振的頻率并不是完全準(zhǔn)確的,常常會(huì)存在一定的偏差。這種偏差是由多種因素造成的,包括溫度變化、電壓變化、機(jī)械應(yīng)力和制造偏差
    的頭像 發(fā)表于 02-21 14:53 ?1025次閱讀
    晶振的頻率<b class='flag-5'>偏差</b>與解決方法

    Orcad繪制原理圖的元器件對(duì)齊方法

    在使用Orcad軟件繪制原理圖的時(shí)候,為了使原理圖繪制的美觀一些,有時(shí)候也希望像PCB設(shè)計(jì)一樣,將所有的器件都進(jìn)行對(duì)齊,這里我們給大家介紹下,原理圖器件對(duì)齊的方法,方便大家在原理圖設(shè)計(jì)的時(shí)候也可以將元器件進(jìn)行對(duì)齊。
    的頭像 發(fā)表于 02-07 10:33 ?2521次閱讀
    Orcad繪制原理圖的元器件<b class='flag-5'>對(duì)齊</b>方法

    ADR4520的負(fù)載調(diào)整度有點(diǎn)偏差是什么原因引起的?

    的負(fù)載調(diào)整度有點(diǎn)偏差(應(yīng)該是等效內(nèi)阻大吧),所以準(zhǔn)備用ADS1255資料推薦的OPA350做一級(jí)緩沖,不過(guò)發(fā)現(xiàn)有以下幾個(gè)問(wèn)題讓我感覺(jué)到很困惑: 1.OPA350的失調(diào)電壓居然高達(dá)1mV(這個(gè)數(shù)值可以
    發(fā)表于 12-18 06:56

    干法蝕刻異向機(jī)制的原理解

    無(wú)偏差的刻蝕過(guò)程,我們稱之為各向異性刻蝕。為了更清晰地理解這一過(guò)程,我們可以將其拆解為幾個(gè)基本環(huán)節(jié)。首先,第一個(gè)環(huán)節(jié)是刻蝕氣體的處理,這些氣體在等離子環(huán)境中會(huì)被分解成離子、自由基等具有刻蝕作用
    的頭像 發(fā)表于 12-17 10:48 ?1819次閱讀
    干法蝕刻異向機(jī)制的原<b class='flag-5'>理解</b>析

    KiCad的對(duì)齊工具不好用?

    “ ?不存在的。唯一的原因是您還沒(méi)有學(xué)會(huì)怎么用。 ? ” 對(duì)齊命令在哪里? KiCad的對(duì)齊命令(Align)藏得比較隱蔽,既不在菜單欄,也不在工具欄。右鍵的菜單中默認(rèn)也不存在。只有當(dāng)您 選中兩個(gè)或
    的頭像 發(fā)表于 12-04 18:15 ?1865次閱讀
    KiCad的<b class='flag-5'>對(duì)齊</b>工具不好用?