在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

對結構體的對齊理解上有點偏差

冬至配餃子 ? 來源:最后一個bug ? 作者:bug菌 ? 2022-08-10 18:08 ? 次閱讀

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

1、變量與內存

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

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

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

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

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

2、結構體對齊

理解了上面的一個思路,那么我們來分析分析結構體對齊問題。

參考demo:

pYYBAGLzgjeAT8iJAAD1H7F0bjk340.pngpYYBAGLzgj2ARVKUAAC0Xb725aI681.png

運行結果:

poYBAGLzglmACdHRAAAwvobA02U713.png

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

下面簡單分析一下結果:

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

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

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

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

pYYBAGLzgnOAR4kbAAA_oPyNI74889.png

其輸出結果如下:

pYYBAGLzgpSARzfuAAAupVKITM0562.png

結構體所占據的字節是12個,那是不是認為8字節對齊沒有意義呢?我們再看一個實驗:

poYBAGLzgqeAFrKaAABIrxc_Zj4505.png

此時double占據了8個字節,按照前面的思路應該是4+8+4,應該最終結構體的大小是16個字節,而結果顯示:

poYBAGLzgr6ABA9MAAAtrVniz38521.png

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

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

3、內存對齊

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

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

poYBAGLzgteADWrAAABvtqExg18425.png

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

pYYBAGLzgu6AXO9DAABqWWJvUDc646.png

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


審核編輯:劉清

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

    關注

    5096

    文章

    19189

    瀏覽量

    308031
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10911

    瀏覽量

    213152
  • C語言
    +關注

    關注

    180

    文章

    7615

    瀏覽量

    137855
  • 編譯器
    +關注

    關注

    1

    文章

    1642

    瀏覽量

    49318
收藏 人收藏

    評論

    相關推薦

    Orcad繪制原理圖的元器件對齊方法

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

    ADR4520的負載調整度有點偏差是什么原因引起的?

    的負載調整度有點偏差(應該是等效內阻大吧),所以準備用ADS1255資料推薦的OPA350做一級緩沖,不過發現有以下幾個問題讓我感覺到很困惑: 1.OPA350的失調電壓居然高達1mV(這個數值可以
    發表于 12-18 06:56

    KiCad的對齊工具不好用?

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

    結構成員的順序會影響結構的大小嗎

    相同的結構成員,如果把順序調整一下,會不會影響結構的大小? 答案是會的,這主要跟字節對齊有關。 比如這樣的
    的頭像 發表于 11-25 16:24 ?277次閱讀

    ARM嵌入式系統中內存對齊的重要性

    做嵌入式系統軟件開發,經常在代碼中看到各種各樣的對齊,很多時候我們都是知其然不知其所以然,知道要做好各種對齊,但是不明白為什么要對齊,不對齊會有哪些后果,這篇文章大概總結了內存
    的頭像 發表于 11-11 17:17 ?1047次閱讀
    ARM嵌入式系統中內存<b class='flag-5'>對齊</b>的重要性

    C語言和C++中結構的區別

    同樣是結構,看看在C語言和C++中有什么區別?
    的頭像 發表于 10-30 15:11 ?365次閱讀

    ota升級的庫中,結構upgrade_server_info中pespconn的作用是什么?

    check_cb; struct espconn *pespconn; }; 這個結構中已經有ip,port,pespconn這個結構
    發表于 07-12 06:33

    聚徽觸控-工控一機和 PLC 一機有什么不同

    在工業自動化領域,工控一機和 PLC 一機都扮演著重要角色。盡管它們在某種程度上有所重疊,但它們在功能、應用和設計結構等方面存在顯著的不同。工控一
    的頭像 發表于 06-21 10:05 ?597次閱讀

    你是否真的了解結構占用了多少字節?

    結構成員所占內存空間大小一般情況下,如果想知道結構成員的內存占用情況需要:1、先用結構在內
    的頭像 發表于 06-04 08:04 ?584次閱讀
    你是否真的了解<b class='flag-5'>結構</b><b class='flag-5'>體</b>占用了多少字節?

    嵌入式中C語言結構基本實現

    C語言中的數組只能允許程序員定義存儲相同類型數據。但是結構是C語言編程中允許您存儲不同數據類型的數據。 結構的定義 ????要想定義結構,必須用到 struct 關鍵字,struct
    的頭像 發表于 05-11 08:49 ?1134次閱讀
    嵌入式中C語言<b class='flag-5'>結構</b><b class='flag-5'>體</b>基本實現

    深入理解 FPGA 的基礎結構

    轉載地址:https://zhuanlan.zhihu.com/p/506828648 文章很詳細的介紹了FPGA的基礎結構,能更直觀的理解內部結構原理。對深入學習很有幫助。 以下是正文: 這一段
    發表于 04-03 17:39

    C語言結構史上最詳細的講解【軟件干貨】

    struct結構數據類型 前言 我們知道,在C語言中有一些基本的數據類型,如?char?int?float?long?double?string(c99) 等等數據類型,他們可以表示一些事物
    的頭像 發表于 03-28 17:52 ?863次閱讀

    STM32關于FLASH的編程對齊錯誤標志位(PGAERR)的疑問求解

    大神們,我現在正在做一個應用,需要熟悉STM32F4的FLASH的任何錯誤標識,以用于特殊情況下的錯誤標識判斷做相應處理,但是針對FLASH的編程對齊錯誤標志(PGAERR)與我理解不同。 原文
    發表于 03-22 07:59

    使用LSM6DSOWTR里面的temperature sensor,為什么temperature offset達到了±15℃的偏差

    你好,我們想使用LSM6DSOWTR里面的temperature sensor,但是看到規格書里面對temperature sensor的描述,temperature offset達到了±15℃的偏差,這個地方有點無法理解,這個
    發表于 03-15 07:59

    求助,關于G031ADC結構設置的幾個疑問求解

    本人在使用ADC時想使用多通道模式,所以便在CUBEMX上將十九個通道全部打開(包括三個內部通道),生成代碼以后詳細看了一下結構的配置發現有幾個疑惑, 1.ADC通道分為規則通道和注入通道,那么
    發表于 03-15 07:03
    主站蜘蛛池模板: 天天摸夜夜添夜夜添国产 | 成人精品综合免费视频 | 色鬼久久| 五月天婷婷丁香 | 特极毛片| 午夜看片影院在线观看 | 黄色视屏在线免费播放 | 888午夜不卡理论久久 | 美女扒开尿口给男人桶动态图 | 色综合久久中文字幕网 | 国产va免费精品高清在线观看 | 高清欧美性xxxx成熟 | 一色屋免费视频 | 关晓彤被调教出奶水的视频 | 最近免费 | 亚洲一区毛片 | 男人j进女人j的一进一出视频 | 色多多影视 | aa视频免费| 日韩第二页 | 天堂在线链接 | 欧洲亚洲一区 | 亚洲免费视频在线观看 | 国产午夜在线观看 | 超h 高h 污肉1v1御书屋 | 最新国产精品视频免费看 | 韩国电影天堂网 | 日韩一区二区视频在线观看 | 一级片 在线播放 | 激情综合激情五月 | 久久在草| 四虎在线最新地址4hu | 国产精品久久久久久久久免费 | 精品一区二区三区三区 | 日本在线网址 | 亚洲黄色网址在线观看 | 一区二区三区高清在线 | 毛片色毛片18毛片美女 | 1v1双性受整夜不拔bl | 又粗又长又爽又长黄免费视频 | 欧美激情综合色综合啪啪五月 |