最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言中結(jié)構(gòu)體、聯(lián)合體的成員內(nèi)存對(duì)齊情況

 更新時(shí)間:2021年05月10日 12:38:18   作者:良知猶存  
這篇文章主要給大家介紹了關(guān)于C語言中結(jié)構(gòu)體、聯(lián)合體的成員內(nèi)存對(duì)齊情況的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

最近項(xiàng)目進(jìn)行中,遇到一個(gè)小問題,在數(shù)據(jù)協(xié)議傳輸過程中,我為了方便解析,就定義了一個(gè)結(jié)構(gòu)體,在數(shù)據(jù)的指針傳入函數(shù)的時(shí)候,我用定義好的結(jié)構(gòu)體進(jìn)行強(qiáng)制轉(zhuǎn)化,沒想到一直解析失敗,調(diào)試很久,終于反應(yīng)過來,在用結(jié)構(gòu)體指針對(duì)數(shù)據(jù)強(qiáng)制轉(zhuǎn)換時(shí),定義結(jié)構(gòu)體我沒有注意到數(shù)據(jù)對(duì)齊,因?yàn)樵诘讓訉?shí)現(xiàn)中,我傳入的數(shù)據(jù)buffer是排列整齊的,而強(qiáng)制轉(zhuǎn)化的結(jié)構(gòu)體格式中,我定義的時(shí)候沒有使用__attribute__((__packed__))或者_(dá)_packed強(qiáng)制數(shù)據(jù)對(duì)齊,導(dǎo)致結(jié)構(gòu)體成員真實(shí)排列會(huì)按照成員中最大的變量的格式進(jìn)行對(duì)其,缺少的地方被虛擬補(bǔ)充位置。

下面就稍微簡(jiǎn)單描述一下結(jié)構(gòu)體數(shù)據(jù)對(duì)齊的講解:

 圖片描述的兩種實(shí)現(xiàn)結(jié)構(gòu)對(duì)齊的聲明,適用于結(jié)構(gòu)體和聯(lián)合的聲明。

接下來展示幾組聲明結(jié)構(gòu)體后成員變量對(duì)齊的方式:

/*第一個(gè)示例*/
struct stc
{
    char one;
    short two;
    char three;
    int four;
} c,d;


int main (void)
{
    c.one=1;
    return 0;
}

第一個(gè)示例代碼配合下方內(nèi)存排列的圖片,可以看到,在正常無特殊聲明的情況下,結(jié)構(gòu)體在內(nèi)存排列是按照結(jié)構(gòu)體成員中最大的變量的大小進(jìn)行排列的。

第一處示例代碼中,最大的成員變量是int型,一個(gè)int型在我使用的32位ARM環(huán)境中占4個(gè)byte,所以在排列中,最小的排列單位是4byte,而其他類型,char占1個(gè)byte,short占2個(gè)byte,在排列的第一行的4個(gè)byte中,一個(gè)char+一個(gè)short類型為3byte,所以需要補(bǔ)上1byte的虛擬空間,第二行的4byte中,還剩下一個(gè)char和int,int單獨(dú)占一行,所以char需要補(bǔ)上3byte才能排列整齊。

/*第二個(gè)示例*/
struct __attribute__((packed)) stc
{
    char one;
    short two;
    char three;
    int four;
} c,d;


int main (void)
{
    c.one=1;
    return 0;
}

第二個(gè)示例代碼配合下方內(nèi)存排列的圖片,可以看到,代碼使用了__attribute__((packed))聲明,這個(gè)聲明的含義是,令相關(guān)的結(jié)構(gòu)體與聯(lián)合體強(qiáng)制一字節(jié)對(duì)齊。所以在內(nèi)存中排列中,按照1byte的數(shù)據(jù)對(duì)齊方式,成員變量緊密排布。

/*第三個(gè)示例*/
#pragma pack (2)
struct stc
{
    char one;
    short two;
    char three;
    int four;
} c,d;


int main (void)
{
    c.one=1;
    return 0;
}

/*第四個(gè)示例*/
#pragma pack (4)
struct stc
{
    char one;
    short two;
    char three;
    int four;
} c,d;


int main (void)
{
    c.one=1;
    return 0;
}

第三、四個(gè)示例代碼配合下方內(nèi)存排列的圖片,可以看到,代碼使用了#pragma pack (n)聲明,這個(gè)聲明的含義是,令相關(guān)的結(jié)構(gòu)體與聯(lián)合體強(qiáng)制N字節(jié)對(duì)齊,這個(gè)聲明和__attribute__((packed))功能類似,但是__attribute__((packed))只能進(jìn)行一字節(jié)強(qiáng)制對(duì)齊,而#pragma pack (n)對(duì)齊字節(jié)數(shù),由n進(jìn)行控制,所以有很多的靈活性。具體使用可以從下圖成員對(duì)齊情況了解,此處就不進(jìn)行贅述了。

總結(jié)

到此這篇關(guān)于C語言中結(jié)構(gòu)體、聯(lián)合體的成員內(nèi)存對(duì)齊情況的文章就介紹到這了,更多相關(guān)C語言結(jié)構(gòu)體、聯(lián)合體內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于C語言 文件讀寫 feof 函數(shù)

    關(guān)于C語言 文件讀寫 feof 函數(shù)

    這篇文章主要給大家分享的是關(guān)于C語言文件讀寫 feof 函數(shù) ,feof 是 C 語言標(biāo)準(zhǔn)庫函數(shù),其功能是檢測(cè)文件結(jié)束符,如果文件結(jié)束,則返回非 0 值,否則返回 0,感興趣的小伙伴請(qǐng)跟小編一起來看看下面文章的內(nèi)容吧
    2021-10-10
  • C 語言指針概念的詳解

    C 語言指針概念的詳解

    這里主要介紹C 語言指針,這里整理了詳細(xì)的資料,對(duì)指針做了詳細(xì)說明及簡(jiǎn)單示例代碼幫助大家理解什么是指針,有興趣的小伙伴可以參考下
    2016-08-08
  • C語言實(shí)現(xiàn)排雷游戲(多文件)

    C語言實(shí)現(xiàn)排雷游戲(多文件)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)排雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C語言二叉樹與堆的概念與實(shí)現(xiàn)

    C語言二叉樹與堆的概念與實(shí)現(xiàn)

    這篇文章主要給大家介紹了關(guān)于C語言二叉樹與堆的相關(guān)資料,文章詳細(xì)記錄了他們的相關(guān)概念以及如何實(shí)現(xiàn)的,通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2021-06-06
  • C語言 二叉樹的鏈?zhǔn)酱鎯?chǔ)實(shí)例

    C語言 二叉樹的鏈?zhǔn)酱鎯?chǔ)實(shí)例

    本篇文章主要介紹C語言中二叉樹的鏈?zhǔn)酱鎯?chǔ),這里提供了一個(gè)實(shí)例代碼進(jìn)行參考,這樣對(duì)二叉樹的鏈?zhǔn)酱鎯?chǔ)有更深入的了解,希望能幫到學(xué)習(xí)這塊知識(shí)的同學(xué)
    2016-07-07
  • C++重載輸入和輸出運(yùn)算符詳解

    C++重載輸入和輸出運(yùn)算符詳解

    在C++中,標(biāo)準(zhǔn)庫本身已經(jīng)對(duì)左移運(yùn)算符<<和右移運(yùn)算符>>分別進(jìn)行了重載,使其能夠用于不同數(shù)據(jù)的輸入輸出,本節(jié)以前面的?complex?類為例來演示輸入輸出運(yùn)算符的重載,需要的朋友可以參考下
    2023-09-09
  • C++ 數(shù)據(jù)結(jié)構(gòu)之布隆過濾器

    C++ 數(shù)據(jù)結(jié)構(gòu)之布隆過濾器

    這篇文章主要介紹了C++ 數(shù)據(jù)結(jié)構(gòu)之布隆過濾器的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 詳解VSCode下C++環(huán)境配置過程

    詳解VSCode下C++環(huán)境配置過程

    這篇文章主要介紹了VSCode C++環(huán)境配置過程,在這大家需要在代碼的目錄下的.vscode文件夾下創(chuàng)建launch.json、tasks.json,具體實(shí)現(xiàn)過程跟隨小編一起看看吧
    2021-11-11
  • 基于Matlab制作一款簡(jiǎn)單的龍舟小游戲

    基于Matlab制作一款簡(jiǎn)單的龍舟小游戲

    這篇文章主要為大家介紹如何利用Matlab制作一款簡(jiǎn)單的龍舟小游戲,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定幫助,需要的可以參考一下
    2022-03-03
  • C++定義和初始化string對(duì)象實(shí)例詳解

    C++定義和初始化string對(duì)象實(shí)例詳解

    這篇文章主要為大家介紹了C++定義和初始化string對(duì)象實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12

最新評(píng)論

黄陵县| 江阴市| 紫阳县| 禄丰县| 收藏| 尚志市| 夏邑县| 项城市| 新邵县| 鹤壁市| 淮北市| 赞皇县| 巴青县| 黄梅县| 富锦市| 洮南市| 马边| 循化| 马尔康县| 清镇市| 来安县| 南皮县| 德江县| 汪清县| 古浪县| 蓬莱市| 乌兰察布市| 丰城市| 台东县| 金寨县| 宁南县| 黔东| 郓城县| 囊谦县| 微山县| 武山县| 盘锦市| 永州市| 石屏县| 若羌县| 马公市|