衡阳派盒市场营销有限公司

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

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

3天內不再提示

什么是結構體的字節對齊現象

麥辣雞腿堡 ? 來源:軒哥談芯 ? 作者:義軒 ? 2023-11-20 15:55 ? 次閱讀

什么是結構體的字節對齊現象

程序員,咱都用代碼說話,先上 code:

(說明:以下代碼均在 ARM 平臺上,使用 Keil 進行編譯測試)

#define offset_of(TYPE, MEMBER) ((size_t) &((TYPE *)0)-MEMBER) //上面這個宏定義主要用于顯示結構體成員變量相對結構體起始地址的偏移
typedef structstu1{ int a; char b; int c;}stu1;
void main(){ LOG_INFO("rnrn====== Struct Test ======rnrn"); LOG_INFO("offset_of(stu1,a):t%dn",offset_of(stu1,a)); LOG_INFO("offset_of(stu1,b):t%dn",offset_of(stu1,b)); LOG_INFO("offset_of(stu1,c):t%dn",offset_of(stu1,c)); LOG_INFO("sizeof(stu1) :t%dn",sizeof(stu1)); return ;}

圖片

對于上面的運行結果,對字節對齊不了解的同學可能會疑惑,c的偏移量怎么會是8呢?不應該是 5 嗎?

結構體的大小怎么會是12呢?不應該是 9 嗎?

不了解的同學可能會這樣理解:

c的偏移量是sizeof(int)+sizeof(char) = 5

結構體stu1占用的內存大小應該是sizeof(int)+sizeof(char)+sizeof(int)=9。

通過下圖所示的stu1的內存結構可以知道,編譯器對變量存儲進行了一個特殊處理。

圖片

為了提高CPU的存儲速度,編譯器對一些變量的起始地址做了對齊處理。

在默認情況下,編譯器規定各成員變量存放的起始地址相對于結構體的起始地址的偏移量,必須為該變量的類型所占用的字節數和編譯器編譯過程中采用的字節對齊數兩者中最小值的整數倍。

有點繞,比如stu1 結構體中,變量 c 類型為 int,也就是占用 4 字節,編譯器采用 4 字節對齊,因此偏移量必須是 4 的整數倍。

typedef structstu2{    int a;    char b;    char c    int d;}stu2;

再比上面的 stu2中,如對于變量 c,其類型為 char ,占用 1 字節,編譯器采用 4 字節對齊,因此 它被分配的偏移量需要是 1 的整數倍,在上面的結構體 stu2 中,c 的偏移量為 5。

如圖:

圖片

現在來分析前面的代碼

假定a的起始地址為0,它占用了4字節,接下來的空閑地址就是4,是1的倍數,滿足要求,所以b存放的起始地址是4,占用一個字節,接下來的空閑地址為5。c也是char變量,占用1字節, 因此可以放在地址 5 上面。

接下來看地址 6,對于 d,它占用了 4 個字節,同時需要注意的是,編譯器默認按照結構體中占有內存最大的類型所占用的字節數進行字節對齊。在此結構體中占用內存最大的為整型,占用4字節,所以在此取兩者的最小值4,6 并不是4的整數倍,所以向后移動,找到離6最近的8作為存放d的起始地址,d也占用4字節,最后結構體的大小為12。

需要注意的就是,變量b和 c后面2字節的存儲空間是由編譯器自動填充的,其中沒有存儲任何有用的信息

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

    關注

    134

    文章

    9169

    瀏覽量

    369239
  • 字節
    +關注

    關注

    0

    文章

    41

    瀏覽量

    13806
  • 代碼
    +關注

    關注

    30

    文章

    4828

    瀏覽量

    69058
  • 結構體
    +關注

    關注

    1

    文章

    130

    瀏覽量

    10872
收藏 人收藏

    評論

    相關推薦

    C語言-結構對齊詳解

    ", sizeof (struct mystruct1));// sizeof (struct mystruct1) = 8} 分析:整個結構變量4字節對齊是由編譯器保證
    發表于 07-12 16:41

    RM48HDK平臺CCS結構字節對齊總是咨詢

    硬件平臺:RM48HDK? 軟件平臺:5.4.0.00091? 編譯器:TI V5.0.6 我在程序中想對一個結構增加單字節對齊屬性,增加方式如下: 1、參照《ARM Optimiz
    發表于 05-25 10:38

    CCS3.3 結構成員對齊

    : expected a type specifier error: expected a ";" 這個錯誤。是CCS3.3編譯器本身不支持__packed這種結構成員的對齊方式
    發表于 06-21 10:16

    請問在ccs4.2 中怎么設置結構字節對齊

    請問在ccs4.2 中怎么設置結構字節對齊,用于網絡數據發送的。是:]__attribute__((packed))還是:#pragma pack(1)編譯后,兩種都不行,是什么原
    發表于 08-02 07:47

    請問z-stack結構默認對齊方式是一字節嗎?

    z-stack的結構默認對齊方式是一字節嗎?在z-stack中可以將一般指針強制轉換為結構
    發表于 08-18 07:38

    請問cc2640r2 ccs7.4結構字節能實現對齊嗎?

    請問結構字節下面能實現字節對齊么#pragma pack(1)typedef struct [ uint16_t nt ; uint8_t
    發表于 10-31 10:10

    STM32終極字節對齊的相關資料推薦

    字節對齊。uint64_t定義變量地址要8字節對齊。指針變量是4字節對齊。二、
    發表于 12-06 06:03

    解析C語言結構字節如何對齊

    01 默認字節對齊 C語言結構字節對齊是老生常談的問題了,也是高頻面試題,現在我們來深入研究這
    的頭像 發表于 06-12 17:42 ?3141次閱讀

    C語言中Linux字節對齊的問題

    ,于是經過排查,是因為傳遞消息的結構沒有考慮字節對齊的問題。 隨手整理一下C語言中字節對齊的問
    的頭像 發表于 08-16 11:25 ?2530次閱讀
    C語言中Linux<b class='flag-5'>字節</b><b class='flag-5'>對齊</b>的問題

    STM32 終極字節對齊解析

    字節對齊。uint64_t定義變量地址要8字節對齊。指針變量是4字節對齊。二、
    發表于 11-23 18:06 ?11次下載
    STM32 終極<b class='flag-5'>字節</b><b class='flag-5'>對齊</b>解析

    結構對齊理解上有點偏差

    總結一下: 結構對齊不再是簡單的字節個數的拼湊,而是要與內存地址進行掛鉤~一般我們也可以理解為內存地址分配是多少字節的倍數,就是多少直接
    的頭像 發表于 08-10 18:08 ?1238次閱讀
    對<b class='flag-5'>結構</b><b class='flag-5'>體</b>的<b class='flag-5'>對齊</b>理解上有點偏差

    結構對齊為什么那么重要?

    以前我也沒覺得懂得這個結構對齊或者內存對齊有多重要,直到已經從事了嵌入式開發經驗不斷積累,才慢慢體會到,這是一種很基礎的知識,就因為這個東西不常用,而出現相關的問題是非常致命的,排查
    的頭像 發表于 04-03 10:13 ?1443次閱讀

    為什么要結構對齊?為什么結構對齊那么重要?

    C語言結構對齊問題,是面試必備問題。我參與招聘技術面試的時候,也喜歡問這個技術點。
    的頭像 發表于 05-26 14:10 ?1350次閱讀
    為什么要<b class='flag-5'>結構</b><b class='flag-5'>體</b><b class='flag-5'>對齊</b>?為什么<b class='flag-5'>結構</b><b class='flag-5'>體</b><b class='flag-5'>對齊</b>那么重要?

    嵌套的結構 字節是如何對齊

    嵌套的結構字節又是如何對齊的呢 先來看下面的代碼 typedef struct stu1 { char ary [ 5 ] ; int a; }stu1; typedef stru
    的頭像 發表于 11-20 16:01 ?602次閱讀
    嵌套的<b class='flag-5'>結構</b><b class='flag-5'>體</b> <b class='flag-5'>字節</b>是如何<b class='flag-5'>對齊</b>的

    keil arm工程中結構1字節對齊如何實現

    的默認對齊方式和規則 結構在Keil Arm工程中的默認對齊方式是根據編譯器或者編譯器選項來定的。通常情況下,編譯器會按照平臺的特定對齊
    的頭像 發表于 01-05 14:40 ?4053次閱讀
    百家乐高手论| 全讯网abckkk.com| 百家乐娱乐皇冠世界杯| 联众百家乐官网的玩法技巧和规则 | 真钱百家乐大转轮| 赌百家乐的方法| 百家乐官网大赌场娱乐网规则 | 百家乐官网下注的规律| 蒙特卡罗国际| 单机棋牌游戏| 大发888真钱游戏平台| 老人头百家乐的玩法技巧和规则| 百家乐六合彩3535| 百家乐网址是多少| 中骏百家乐官网的玩法技巧和规则 | 巨鹿县| 天博国际| bet365提款时间| 大发888娱乐场下载删除| 黄金城百家乐苹果版| 长春百家乐的玩法技巧和规则 | 百家乐赢家公式| 大众百家乐官网娱乐城| 百家乐官网官网7scs| 百家乐官网双龙出海注码法| 太阳城百家乐官网娱乐开户| 长城百家乐官网游戏| 六合彩聊天室| 澳门博彩公司| 博彩投注| 元游棋牌游戏大厅| 大发888游戏平台c17| 大发888真钱游戏下载365| 威尼斯人娱乐场官网网站是多少 | 关于百家乐官网切入点| 百家乐官网怎样算大小| 优博百家乐官网现金网| 百家乐官网境外赌博| 百家乐官网投注法则| 百家乐官网有几种打法| 百家乐官网神仙道官网|