結構體內存對齊

內存對齊

1.說明:

  1. 第一個成員起始於0偏移處
  2. 每個成員按其指定大小和指定對齊參數n中較小的一個進行對齊

    1.偏移地址和成員佔用大小均需對齊
    2.結構體成員對齊參數爲其所有成員使用對齊參數的最大值

  3. 結構體總長度必須爲所有對齊參數的整數倍

2.示例說明:

  • 示例1:

  • 說明:默認爲#pragma pack(4),也就是按4個字節大小對齊

struct test
{
    char c1;//大小:1  對齊:4  起始位置:0    大小:1      空白:0
    short s;//大小:2  對齊:4  起始位置:2    大小:2      空白:1
    char c2;//大小:1  對齊:4  起始位置:4    大小:1      空白:0
    int i;  //大小:4  對齊:4  起始位置:8    大小:4      空白:3
};  //結構體大小爲上面的所有對齊參數的整數倍

int main()
{
    printf("%d\n", sizeof(struct test));    //結果爲12(2+2+4+4)
    return 0;
}
  • 示例2:
#pragma pack(8)     //按8個字節大小對齊,linux下默認4字節對齊,會直接忽略此條語句

struct s1
{
    short a;//大小:2  對齊:8  起始位置:0  大小:2  空白:0
    long b; //大小:4  對齊:8  起始位置:4  大小:4  空白:2
};

//這裏的long是32位編譯器的結果,編譯器不同結果不同

struct s2
{
    char c;     //大小:1  對齊:8  起始位置:0  大小:1  空白:0
    struct s1 d;//大小:4  對齊:8  起始位置:4  大小:8  空白:3
    double e;   //大小:8  對齊:8  起始位置:16 大小:8  空白:4
};

//結構體裏面有結構體的對齊方式是取裏面的結構體對齊數的最大的

int main()
{
    struct s2 s;

    printf("%d\n", sizeof(struct s1));  //8
    printf("%d\n", sizeof(struct s2));  //24
    printf("%d\n", (int)&(s.d) - (int)&(s.c));  //4

    return 0;
}

3.關於數據類型的大小

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