欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

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

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

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

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


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

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

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

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


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

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

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


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

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


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

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

總結(jié)

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

相關(guān)文章

  • C++ 中const對象與const成員函數(shù)的實例詳解

    C++ 中const對象與const成員函數(shù)的實例詳解

    這篇文章主要介紹了C++ 中const對象與const成員函數(shù)的實例詳解的相關(guān)資料,希望通過本文能讓大家徹底掌握該如何使用,需要的朋友可以參考下
    2017-08-08
  • 如何使用C++結(jié)合OpenCV進行圖像處理與分類

    如何使用C++結(jié)合OpenCV進行圖像處理與分類

    在計算機視覺領(lǐng)域,OpenCV與C++結(jié)合能高效處理和分類圖像,C++的高執(zhí)行效率適合大規(guī)模數(shù)據(jù)處理,OpenCV提供豐富的功能,如圖像預(yù)處理和機器學(xué)習(xí)算法,安裝OpenCV需要配置環(huán)境和添加庫文件,本文詳細介紹了使用C++和OpenCV進行圖像分類的過程,包括使用SVM和深度學(xué)習(xí)模型
    2024-09-09
  • C++實現(xiàn)LeetCode(228.總結(jié)區(qū)間)

    C++實現(xiàn)LeetCode(228.總結(jié)區(qū)間)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(228.總結(jié)區(qū)間),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++  線程(串行 并行 同步 異步)詳解

    C++ 線程(串行 并行 同步 異步)詳解

    這篇文章主要介紹了C++ 線程(串行 并行 同步 異步)詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • C語言實現(xiàn)Fibonacci數(shù)列遞歸

    C語言實現(xiàn)Fibonacci數(shù)列遞歸

    這篇文章主要介紹了C語言實現(xiàn)Fibonacci數(shù)列遞歸,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • C C++算法題解LeetCode1408數(shù)組中的字符串匹配

    C C++算法題解LeetCode1408數(shù)組中的字符串匹配

    這篇文章主要為大家介紹了C C++算法題解LeetCode1408數(shù)組中的字符串匹配示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • C++中指針的數(shù)據(jù)類型和運算相關(guān)知識小結(jié)

    C++中指針的數(shù)據(jù)類型和運算相關(guān)知識小結(jié)

    這篇文章主要介紹了C++中指針的數(shù)據(jù)類型和運算相關(guān)知識小結(jié),是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • Visual Studio 2022最新版安裝教程(圖文詳解)

    Visual Studio 2022最新版安裝教程(圖文詳解)

    本文主要介紹了Visual Studio 2022最新版安裝教程,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C++深入探索類和對象之封裝及class與struct的區(qū)別

    C++深入探索類和對象之封裝及class與struct的區(qū)別

    C++?類與對象涉及的知識點非常廣泛,所以我準(zhǔn)備寫成幾個特定的部分來作為博文分享,這次的blog將詳細講解類的屬性、行為、訪問權(quán)限,class與struct的區(qū)別以及具體案例,希望能夠?qū)δ銈冇袔椭鉀Q入門小白或者對這方面了解不多的朋友們,那么接下來開始今天的內(nèi)容
    2022-05-05
  • C++實現(xiàn)投骰子的隨機游戲

    C++實現(xiàn)投骰子的隨機游戲

    這篇文章主要為大家詳細介紹了C++實現(xiàn)投骰子的隨機游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04

最新評論