一 自然對齊
各個型別自然對齊,即其起始記憶體位址必須是其型別本身的整數倍。
對於結構體來說,結構體的起始記憶體位址,必須是結構體中成員最大長度型別的整數倍。
結構體自然對齊應遵守如下規則
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...