位元組對齊原則

2021-10-06 14:24:54 字數 689 閱讀 8144

一 簡單型別

char 偏移量必須為sizeof(char) 即1的倍數,可以任意位址開始儲存

short 偏移量必須為sizeof(short) 即2的倍數,只能從0,2,4...等2的倍數的位址開始儲存

int 偏移量必須為sizeof(int) 即4的倍數,只能從0,4,8...等4的倍數的位址開始儲存

float 偏移量必須為sizeof(float) 即4的倍數,只能從0,4,8...等4的倍數的位址開始儲存

double 偏移量必須為sizeof(double)即8的倍數,只能從0,8,16...等位址開始儲存

二 結構體

當未明確指定時,以結構體中最長的成員的長度為其有效值,上面的兩個結構體都是int型別最長,也就是4位元組對齊

結構體作為成員:如果乙個結構裡有某些結構體成員,則結構體成員要從其內部最大元素大小的整數倍位址開始儲存.(struct a裡存有struct b,b裡有char,int ,double等元素,那b應該從8的整數倍開始儲存.)

結構體的總大小,也就是sizeof的結果,必須是其內部最大成員的整數倍.不足的要補齊

當用#pragma pack(n)指定時,以n和結構體中最長的成員的長度中較小者為其值

用#pragma pack()為還原位元組對齊為預設值

attribute ((packed)) 1位元組對齊,此時結構體的長度就是各成員變數長度之和

位元組對齊原則

位元組對齊原則 結構體預設的位元組對齊一般滿足三個準則 1 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除 2 結構體每個成員相對於結構體首位址的偏移量 offset 都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組 internal adding 3 結構體的總大小為結構體最...

記憶體位元組對齊原則

請牢記以下3條原則 在沒有 pragma pack巨集的情況下,務必看完最後一行 資料成員對齊規則 結構 struct 或聯合 union 的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小或者成員的子成員大小 只要該成員有子成員,比如說是陣列,結構體...

記憶體位元組對齊原則 總結

似乎每一家企業在招聘的時候都很關注這個問題,無論在筆試還是面試都會提及。zz最近找工作就經常遇到這樣的問題,儘管之前有去了解過,但自己沒有總結過,還是回答錯了這才想起來總結了,為時不晚吧。位元組對齊的原則主要有倆條 在沒有 pragma pack的情況下 1 sizeof的最終結果必然是結構內部最大...