天天看點

C語言位元組對齊C語言位元組對齊

C語言位元組對齊

C語言位元組對齊方式分為自然對齊和強制對齊兩種。在結構體的大小的計算中,常會用到位元組對齊的知識。

自然對齊

自然對齊規則

  • 資料成員對齊規則

    在預設情況下,結構體成員變量的存放起始位址相對于結構體的起始位址的偏移量為sizeof(類型)的倍數。
  • 整體對齊規則

    結構體總體大小必須為sizeof(最大類型)的整數倍。

自然對齊例子

struct one
    {
        char   a;
        int    b;
        long   c;
        double d;
    };
           

sizeof(one) = sizeof(char) + 3 + sizeof(int) + sizeof(long) + 4 + sizeof(double) = 24;24為3 * sizeof(double),滿足整體對齊規則。

強制對齊

通過下面指令指定按n位元組強制對齊

#pragma pack(n) //指定以下代碼為n位元組對齊
    ···
    ···
    #pragma pack()  //恢複預設對齊方式
           

還可以通過下面的方式儲存原有的對齊方式

#pragma pack(push)  //儲存現有的對齊方式
    #pragma pack(n)     //指定新的對齊方式
    ···
    ···
    #pragma pack(pop)   //恢複原來的對齊方式
    ···
    ···
           

強制對齊規則

  • 資料成員對齊規則

    結構體成員變量的存放起始位址相對于結構體的起始位址的偏移量為min{ sizeof(類型), n }的整數倍。
  • 整體對齊規則

    結構體總體大小必須為min{ sizeof(類型), n }的整數倍。

強制對齊例子

#pragma pack(4)
    struct two
    {
        char   a;
        int    b;
        long   c;
        double d;
        char   e;
    };
           

在四位元組對齊情況下struct two的大小,

sizeof(two)= sizeof(char) + 3 + sizeof(int) + sizeof(long) + sizeof(double) +sizeof(e) + x ;

sizeof(two) = 21 + x;

由于sizeof(two)必須是 min {sizeof(double),4 }的整數倍,也就是4的整數倍 ,是以x = 3,故:

sizeof(two) = 24。

#pragma pack(2)
    struct two
    {
        char   a;
        int    b;
        long   c;
        double d;
        char   e;
    };
           

同樣是struct two,如果是按照2位元組對齊,則

sizeof(two) = sizeof(char) + 1 + sizeof(int) + sizeof(long) + sizeof(double) + sizeof(char) + x;

sizeof(two) = 19 + x;

由于sizeof(two)必須是min {sizeof(double), 2 }的整數倍,也就是2的整數倍,是以x= 1,故:

sizeof(two) = 20。

繼續閱讀