自然對齊和強制對齊

2021-09-24 00:04:32 字數 1102 閱讀 9567

一 自然對齊

各個型別自然對齊,即其起始記憶體位址必須是其型別本身的整數倍。

對於結構體來說,結構體的起始記憶體位址,必須是結構體中成員最大長度型別的整數倍。

結構體自然對齊應遵守如下規則

1 資料成員對齊規則

應該是sizeof(成員變數型別)或者sizeof(成員變數型別)的倍數。

應該是子結構體中最大的基本型別的整數倍。

2 整體對齊規則

結構體占用記憶體的總大小也有約束條件,為最大的基本型別記憶體長度的整數倍。

**如下:

typedef struct a

char c1;

long i;

char c2;

}a按照自然對齊的規則2:現在偏移0-偏移8的9個位元組被占用,結構體大小必須是最大成員變數型別long的倍數,所以sizeof(a)為12

typedef struct b

char c1;

char c2;

long i;  

}b按照自然對齊的規則2:現在偏移0-偏移7的8個位元組被占用,結構體大小必須是最大成員變數型別long的倍數,所以sizeof(a)為8

二 強制對齊

#pragma pack(push) //儲存當前對齊狀態

#pragma pack(n)  //定義對齊單元大小為n

定義結構體

#pragma pack(pop) //恢復儲存的對齊狀態

強制對齊的規則

1 資料成員對齊規則:

min(sizeof(基本型別), n)的整數倍

2 整體對齊規則:

結構體的總大小也有約束條件:

min(sizeof(基本型別), n)的整數倍

可見,如果設定#pragma pack(1),就等於禁掉了資料對齊。

棧上對齊方式:

在x86平台,棧上對齊方式是整數相關型別按照4位元組對齊,浮點數按照8位元組對齊;在x64平台,棧上是按照16位元組對齊。

posted on 2019-05-24 18:12收藏

struct自然對齊和指定對齊

intel 微軟等公司曾經出過一道類似的面試題 include pragma pack 8 struct example1 struct example2 pragma pack int main int argc,char argv 答案是 816 4解釋 程式中第2行 pragma pack 8...

記憶體對齊(自然對齊)

參考 今天與超,暉,棟,宇幾人論此問題,終得以下結論,不知正確與否,姑且記下。對於32位機,cpu的記憶體讀寫週期是4word,所以在記憶體對齊時,皆以此填滿。如 struct a char a double b char c sizeof a 4 8 4 16 struct b char a do...

自然對齊規則

基本型別的長度計算 sizeof char 的長度為 1 sizeof short 的長度為 2 sizeof int 的長度為 4 sizeof long 的長度為 4 win x86和x64都為4,linux x86為4,x64為8 sizeof float 的長度為 4 sizeof doub...