c語言字節對齊的計算方式

結構體的字節對齊,在筆試中經常考到,我們先給出結論,然後以兩道例題字節對齊的計算方式。
(1)struct/class的自身對齊值。對於結構體和類的自身對齊值是所有成員中最大的自身對齊值。結構體和類的對齊原則:先將數據成員對齊,再將結構體和類自身對齊,最終大小與數據成員順序相關。
(2) union的自身對齊值是所有成員中最大的對齊值。union的對齊規則,只需要union自身對齊,不需要數據成員對齊,最終大小與數據成員順序無關。
(3) 指定對齊值。可以使用 #param pack(2)指定對齊值爲n,使用#parama back()恢復默認對齊值(默認對齊值一般爲4)
(4)有效對齊值。有效對齊值=min(類/結構體/成員的自身對齊值,指定對齊值)
(5)有效對齊值決定了數據存放的方式,sizeof運算符是根據有效對齊值計算大小的

Struct字節對齊

struct Data{
    int  a;
    char b;
    short c;

};
int main()
{
    struct Data data;
    cout<<sizeof(data)<<endl;
}

輸出爲8.
a的其實地址爲0,結束地址爲3,起始地址4是1(char的長度)的整數倍,因此b的地址爲4.此時5不是2(short)的證書被因此填充到6,c的地址爲5 ~ 7
在這裏插入圖片描述

struct Data{
    char b;
    int  a;
    short c;

};
int main()
{
    struct Data data;
    cout<<sizeof(data)<<endl;
}

輸出爲12;
假設b的其實地址爲0,起始地址1不爲4(int的長度)的倍數,所以填充到4,注意c結尾也需要被填充。因此長度爲12
在這裏插入圖片描述

struct Data{
    char b;
    short c;
    int  a;


};
int main()
{
    struct Data data;
    cout<<sizeof(data)<<endl;
}

輸出爲8,與上面同理
在這裏插入圖片描述

Union字節對齊

using namespace std;
#pragma pack(2)

union UBffer{
    char buffer[13];
    int number;
}ubuf;
int main()
{
    cout<<sizeof(ubuf)<<endl;//14
}

若將#param pack(2)去掉,結果便爲16

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章