#pragma pack()默認對齊方式

一般的pack對齊格式分別是1,2,4,8,16.

默認的對齊格式,也就是:#pragma pack()

情況下,會在結構體中挑選佔用字節最多的類型,例如double 佔用8個字節,例子:

#pragma pack()

struct A
{
    char c;

    char c1;

    int a;

    double d;

};

上面的結構體長度是16.爲什麼是16,而不是char 8 int 8 double 8

實際上,當我們採用默認的對齊,決定存儲的長度是8個字節,所以每8個字節爲一組,存放數據,但是可能像上面的情況是一個字節的字符,佔用了1個字節的存儲空間,編譯器嘗試利用剩餘的7個空,避免讀取寄存器數值 的時候,從奇數的位置開始讀取數據。所以跳過了一個1個字節。發現下一個元素剛好可以填充從第3個字節開始的位置,所以填充。現在位置移動到了第5個字節,還剩下4個字節,這一組就分配完畢了,此時遇到了一個整型,剛剛好。

如果指定了字節對齊的個數,情況就會不一樣:

#pragma pack(1)

struct A
{
    char c;

    char c1;

    int a;

    double d;

};

變成了14個字節。

 

總結如下:如果沒有指定字節對齊,挑選字節長度最長的類型作爲對齊的字節數。然後分配對齊字節數的空間,嘗試將結構體的成員,往裏面塞,注意存在的開始地址必須是偶數。

 

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