關於位元組對齊的總結

2021-04-23 16:20:48 字數 1126 閱讀 7620

1、使用預設的位元組對齊方式。

規則1:各成員變數存放的起始位址相對於結構的起始位址的偏移量必須為該變數的型別所占用的位元組數的倍數。

注: 下面列出常用型別的對齊方式(vc6.0, 32位系統)。

型別  對齊方式(變數存放的起始位址相對於結構的起始位址的偏移量)

char  偏移量必須為sizeof(char)即1的倍數

int  偏移量必須為sizeof(int)即4的倍數

float  偏移量必須為sizeof(float)即4的倍數

double  偏移量必須為sizeof(double)即8的倍數

short   偏移量必須為sizeof(short)即2的倍數

規則2: 結構的總大小為結構的位元組邊界數(即該結構中占用最大空間的變數的型別所占用的位元組數)的倍數。

2、使用自定義的位元組對齊方式(即,使用「#pragma pack(n)」來設定變數以n位元組對齊方式)。

規則3:如果n大於等於當前變數的型別所占用的位元組數,那麼偏移量必須滿足此變數預設的對齊方式(參照規則1);如果n小於當前變數的型別所占用的位元組數,那麼偏移量為n的倍數,不用使用預設的對齊方式。

規則4:如果n大於等於結構中任何的型別所占用的位元組數,那麼結構的總大小必須為占用空間最大的變數的型別所占用的位元組數的倍數(參照規則2);否則結構的總大小必須為n的倍數。

3、結構中帶有結構

規則5:不必考慮整個子結構,只考慮子結構的基本型別並參照前面的規則來分配空間。

規則6:空結構(即不帶任何的方法和資料)占用的1位元組的空間。

4、列舉中(enum)

規則7:列舉始終占用4位元組的空間。

5、聯合中(union)

規則8:其占用的空間為其中最大成員所占用位元組數,此外聯合總的大小還要考慮「規則2」和「規則4」。

6、類中(class)

規則9:空類(即不帶任何的方法和資料)占用的1位元組的空間。

規則10:結構或者類中的靜態成員和成員函式不對結構或者類的大小產生影響,因為靜態變數和成員函式的儲存位置與結構或者類的例項位址無關。

關於位元組對齊

用乙個例子簡單說明一下 v6環境 輸出結果 char 1 long 4 s1 8 s2 16 結果分析 棧由高向低增長,小端位元組序 addr s1.l 0x12ff7c addr s1.s 0x12ff78 addr s1 0x12ff78 addr s2.l 0x12ff74 addr s2.t...

關於位元組對齊

位元組 byte 是計算機資訊技術用於計量儲存容量和傳輸容量的一種計量單位,乙個位元組等於8位 二進位制數 在utf 8編碼中,乙個英文 字元等於乙個位元組。位元組按照一定規則在空間上排列就是位元組對齊。需要位元組對齊的根本原因在於cpu訪問資料的效率問題。假設上面整型變數的位址不是自然對齊,比如為...

位元組對齊總結

寫在前面位元組對其是面試筆試當中出現頻率算是比較高的乙個知識點。在此總結一下。主要內容例題 pragma pack 2 class bu ubuf void foo typedef char f void enum disk bu 問 sizeof bu 的值是 首先先不急著回答上面的問題如果你不知...