先介紹四個概念:
1)資料型別自身的對齊值:基本資料型別的自身對齊值,等於sizeof(基本資料型別)。
2)指定對齊值:#pragma pack (value)時的指定對齊值value。
3)結構體或者類的自身對齊值:其成員中自身對齊值最大的那個值。
4)資料成員、結構體和類的有效對齊值:自身對齊值和指定對齊值中較小的那個值。
有效對齊值n是最終用來決定資料存放位址方式的值,最重要。有效對齊n,就是表示「對齊在n上」,也就是說該資料的」存放起始位址%n=0」.而資料結構中的資料變數都是按定義的先後順序來排放的。第乙個資料變數的起始位址就是 資料結構的起始位址。結構體的成員變數要對齊排放,結構體本身也要根據自身的有效對齊值圓整(就是結構體成員變數占用總長度需要是對結構體有效對齊值的整 數倍)
1)#pragma pack (value)來告訴編譯器,使用我們指定的對齊值來取代預設的。
如#pragma pack (1) /指定按2位元組對齊/
2)#pragma pack () /取消指定對齊,恢復預設對齊/
的整數倍,往往通過填充位元組來對齊。
原則2:結構體本身要對齊,對齊原則為自身對齊值和指定對齊值中較大的那個值的整數倍。
C C 中的結構體對齊原則
資料成員對齊規則 結構 struct 或聯合 union 的資料成員,第乙個資料成員放在offset為0的地方,每個資料成員儲存的起始位置要從該成員 每個成員本身 大小的整數倍開始 比如int在32位機為 位元組,則要從 的整數倍位址開始儲存 例子 struct node sizeof node 8...
C C 中的結構體對齊原則
資料成員對齊規則 結構 struct 或聯合 union 的資料成員,第乙個資料成員放在offset為0的地方,每個資料成員儲存的起始位置要從該成員 每個成員本身 大小的整數倍開始 比如int在32位機為 位元組,則要從 的整數倍位址開始儲存 例子 struct node sizeof node 8...
結構體 位元組對齊原則
一 對齊準則 位元組對齊的細節和具體的編譯器有關,但一般而言,滿足三個準則 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除 結構體每個成員相對於結構體首位址的偏移量都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組 例如上面第二個結構體變數的位址空間。結構體的總大小為結構體最寬基...