似乎每一家企業在招聘的時候都很關注這個問題,無論在筆試還是面試都會提及。zz最近找工作就經常遇到這樣的問題,儘管之前有去了解過,但自己沒有總結過,還是回答錯了這才想起來總結了,為時不晚吧。
位元組對齊的原則主要有倆條:
在沒有#pragma pack的情況下
1、sizeof的最終結果必然是結構內部最大成員的整數倍,不夠補齊。
結構內部最大成員包含子成員結構體內部的成員,可以這麼理解:
typedef struct a
a;typedef struct bb;
等價於typedef struct bb;
2、結構內部各個成員的首位址必然是自身大小的整數倍。
如果定義了#pragma pack(n),則上述倆條規則可定義為:
1、整個sizeof的最終結果必然是 min[n,結構內部最大成員] 的整數倍,不夠補齊。
2、結構內部各個成員的首位址必然是min[n,自身大小]的整數倍。
由上述原則可知,在寫結構體時,成員先後不要隨意寫哦,應遵循從大到小的原則,這樣有助於節省空間。
舉例如下:
struct a
short d;//0~1
double e;//8~15 規則2(應該知道我指的是哪條規則吧)
int c;//16~20 符合規則2
}*****24 規則1
struct a
double e;//0~7
int c;//8~11 符合規則2
short d;//12~13 符合規則2
}*****16 規則1
#pragma pack(2)
typedef struct a
a;*****=14 符合規則1
#pragma pack(4)
typedef struct a
a;*****=16 符合規則1
#pragma pack(4)
typedef struct a
a;*****=20 規則1
大家可以思考一下下面的sizeof會是多少?
#pragma pack(2)
typedef struct a
a;
記憶體位元組對齊原則
請牢記以下3條原則 在沒有 pragma pack巨集的情況下,務必看完最後一行 資料成員對齊規則 結構 struct 或聯合 union 的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小或者成員的子成員大小 只要該成員有子成員,比如說是陣列,結構體...
記憶體位元組對齊總結
一 記憶體對齊的原因 大部分的參考資料都是如是說的 1 平台原因 移植原因 不是所有的硬體平台都能訪問任意位址上的任意資料的 某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。2 效能原因 資料結構 尤其是棧 應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需...
位元組對齊原則
位元組對齊原則 結構體預設的位元組對齊一般滿足三個準則 1 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除 2 結構體每個成員相對於結構體首位址的偏移量 offset 都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組 internal adding 3 結構體的總大小為結構體最...