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

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

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

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

什么是結(jié)構(gòu)體的字節(jié)對(duì)齊現(xiàn)象

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

什么是結(jié)構(gòu)體的字節(jié)對(duì)齊現(xiàn)象

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

(說明:以下代碼均在 ARM 平臺(tái)上,使用 Keil 進(jìn)行編譯測(cè)試)

#define offset_of(TYPE, MEMBER) ((size_t) &((TYPE *)0)-MEMBER) //上面這個(gè)宏定義主要用于顯示結(jié)構(gòu)體成員變量相對(duì)結(jié)構(gòu)體起始地址的偏移
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 ;}

圖片

對(duì)于上面的運(yùn)行結(jié)果,對(duì)字節(jié)對(duì)齊不了解的同學(xué)可能會(huì)疑惑,c的偏移量怎么會(huì)是8呢?不應(yīng)該是 5 嗎?

結(jié)構(gòu)體的大小怎么會(huì)是12呢?不應(yīng)該是 9 嗎?

不了解的同學(xué)可能會(huì)這樣理解:

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

結(jié)構(gòu)體stu1占用的內(nèi)存大小應(yīng)該是sizeof(int)+sizeof(char)+sizeof(int)=9。

通過下圖所示的stu1的內(nèi)存結(jié)構(gòu)可以知道,編譯器對(duì)變量存儲(chǔ)進(jìn)行了一個(gè)特殊處理。

圖片

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

在默認(rèn)情況下,編譯器規(guī)定各成員變量存放的起始地址相對(duì)于結(jié)構(gòu)體的起始地址的偏移量,必須為該變量的類型所占用的字節(jié)數(shù)和編譯器編譯過程中采用的字節(jié)對(duì)齊數(shù)兩者中最小值的整數(shù)倍。

有點(diǎn)繞,比如stu1 結(jié)構(gòu)體中,變量 c 類型為 int,也就是占用 4 字節(jié),編譯器采用 4 字節(jié)對(duì)齊,因此偏移量必須是 4 的整數(shù)倍。

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

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

如圖:

圖片

現(xiàn)在來分析前面的代碼

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

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

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

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

    關(guān)注

    134

    文章

    9121

    瀏覽量

    368230
  • 字節(jié)
    +關(guān)注

    關(guān)注

    0

    文章

    40

    瀏覽量

    13775
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4808

    瀏覽量

    68808
  • 結(jié)構(gòu)體
    +關(guān)注

    關(guān)注

    1

    文章

    130

    瀏覽量

    10860
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語言-結(jié)構(gòu)對(duì)齊詳解

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

    RM48HDK平臺(tái)CCS結(jié)構(gòu)字節(jié)對(duì)齊總是咨詢

    硬件平臺(tái):RM48HDK? 軟件平臺(tái):5.4.0.00091? 編譯器:TI V5.0.6 我在程序中想對(duì)一個(gè)結(jié)構(gòu)增加單字節(jié)對(duì)齊屬性,增加方式如下: 1、參照《ARM Optimiz
    發(fā)表于 05-25 10:38

    CCS3.3 結(jié)構(gòu)成員對(duì)齊

    : expected a type specifier error: expected a ";" 這個(gè)錯(cuò)誤。是CCS3.3編譯器本身不支持__packed這種結(jié)構(gòu)成員的對(duì)齊方式
    發(fā)表于 06-21 10:16

    請(qǐng)問在ccs4.2 中怎么設(shè)置結(jié)構(gòu)字節(jié)對(duì)齊

    請(qǐng)問在ccs4.2 中怎么設(shè)置結(jié)構(gòu)字節(jié)對(duì)齊,用于網(wǎng)絡(luò)數(shù)據(jù)發(fā)送的。是:]__attribute__((packed))還是:#pragma pack(1)編譯后,兩種都不行,是什么原
    發(fā)表于 08-02 07:47

    請(qǐng)問z-stack結(jié)構(gòu)默認(rèn)對(duì)齊方式是一字節(jié)嗎?

    z-stack的結(jié)構(gòu)默認(rèn)對(duì)齊方式是一字節(jié)嗎?在z-stack中可以將一般指針強(qiáng)制轉(zhuǎn)換為結(jié)構(gòu)
    發(fā)表于 08-18 07:38

    請(qǐng)問cc2640r2 ccs7.4結(jié)構(gòu)字節(jié)能實(shí)現(xiàn)對(duì)齊嗎?

    請(qǐng)問結(jié)構(gòu)字節(jié)下面能實(shí)現(xiàn)字節(jié)對(duì)齊么#pragma pack(1)typedef struct [ uint16_t nt ; uint8_t
    發(fā)表于 10-31 10:10

    STM32終極字節(jié)對(duì)齊的相關(guān)資料推薦

    字節(jié)對(duì)齊。uint64_t定義變量地址要8字節(jié)對(duì)齊。指針變量是4字節(jié)對(duì)齊。二、
    發(fā)表于 12-06 06:03

    解析C語言結(jié)構(gòu)字節(jié)如何對(duì)齊

    01 默認(rèn)字節(jié)對(duì)齊 C語言結(jié)構(gòu)字節(jié)對(duì)齊是老生常談的問題了,也是高頻面試題,現(xiàn)在我們來深入研究這
    的頭像 發(fā)表于 06-12 17:42 ?3116次閱讀

    C語言中Linux字節(jié)對(duì)齊的問題

    ,于是經(jīng)過排查,是因?yàn)閭鬟f消息的結(jié)構(gòu)沒有考慮字節(jié)對(duì)齊的問題。 隨手整理一下C語言中字節(jié)對(duì)齊的問
    的頭像 發(fā)表于 08-16 11:25 ?2501次閱讀
    C語言中Linux<b class='flag-5'>字節(jié)</b><b class='flag-5'>對(duì)齊</b>的問題

    STM32 終極字節(jié)對(duì)齊解析

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

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

    總結(jié)一下: 結(jié)構(gòu)對(duì)齊不再是簡(jiǎn)單的字節(jié)個(gè)數(shù)的拼湊,而是要與內(nèi)存地址進(jìn)行掛鉤~一般我們也可以理解為內(nèi)存地址分配是多少字節(jié)的倍數(shù),就是多少直接
    的頭像 發(fā)表于 08-10 18:08 ?1220次閱讀
    對(duì)<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>的<b class='flag-5'>對(duì)齊</b>理解上有點(diǎn)偏差

    結(jié)構(gòu)對(duì)齊為什么那么重要?

    以前我也沒覺得懂得這個(gè)結(jié)構(gòu)對(duì)齊或者內(nèi)存對(duì)齊有多重要,直到已經(jīng)從事了嵌入式開發(fā)經(jīng)驗(yàn)不斷積累,才慢慢體會(huì)到,這是一種很基礎(chǔ)的知識(shí),就因?yàn)檫@個(gè)東西不常用,而出現(xiàn)相關(guān)的問題是非常致命的,排查
    的頭像 發(fā)表于 04-03 10:13 ?1422次閱讀

    為什么要結(jié)構(gòu)對(duì)齊?為什么結(jié)構(gòu)對(duì)齊那么重要?

    C語言結(jié)構(gòu)對(duì)齊問題,是面試必備問題。我參與招聘技術(shù)面試的時(shí)候,也喜歡問這個(gè)技術(shù)點(diǎn)。
    的頭像 發(fā)表于 05-26 14:10 ?1305次閱讀
    為什么要<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b><b class='flag-5'>對(duì)齊</b>?為什么<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b><b class='flag-5'>對(duì)齊</b>那么重要?

    嵌套的結(jié)構(gòu) 字節(jié)是如何對(duì)齊

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

    keil arm工程中結(jié)構(gòu)1字節(jié)對(duì)齊如何實(shí)現(xiàn)

    的默認(rèn)對(duì)齊方式和規(guī)則 結(jié)構(gòu)在Keil Arm工程中的默認(rèn)對(duì)齊方式是根據(jù)編譯器或者編譯器選項(xiàng)來定的。通常情況下,編譯器會(huì)按照平臺(tái)的特定對(duì)齊
    的頭像 發(fā)表于 01-05 14:40 ?3962次閱讀
    主站蜘蛛池模板: 喷潮白浆| 亚洲91| www.四虎影| 国模私拍在线视频| 日本三级带日本三级带黄首页| 天天色影院| 国产内地激情精品毛片在线一| 欧美日本不卡| 亚洲综合一| 精品一区亚洲| 亚洲一区二区精品推荐| 免看一级a毛片一片成人不卡| 丁香婷婷激情五月| 欧美日本一区| 五月婷婷六月综合| 亚洲国产人成在线观看| 综合网在线观看| 大色综合| 久久婷婷五综合一区二区| 久久国产精品99久久久久久老狼| 国产三级在线观看| 黄色18网站| 最新大黄网站免费| 精品福利在线观看| 一区二区免费视频| 午夜宅男在线视频| 美女流白浆网站| 又黄又爽的成人免费网站| 9797色| 久久久网站亚洲第一| 国产精品臀控福利在线观看| 99在线国产| 性生活毛片| 免费爱爱视频| 毛片123| 亚洲黄色网址| 日韩毛片高清免费| 人人澡人人人人夜夜爽| 午夜欧美成人久久久久久| 免费的毛片| 午夜禁片|