結構體 位元組對齊原則

2021-10-03 23:56:52 字數 754 閱讀 6161

(一)對齊準則

位元組對齊的細節和具體的編譯器有關,但一般而言,滿足三個準則:

結構體變數的首位址能夠被其最寬基本型別成員的大小所整除;

結構體每個成員相對於結構體首位址的偏移量都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組;例如上面第二個結構體變數的位址空間。

結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末乙個成員之後加上填充位元組。

(二)四個基本概念

(1)資料型別自身的對齊值

資料型別				自身對齊值

char型 1

short 2

int 4

float型別 4

double型 8

(2)結構體(類)自身對齊值:成員中自身對齊值最大的那個值

(3)指定對齊值:#pragma pack (value)時的指定對齊值value,一般取值1,2,4…。

(4)結構體(類)的有效對齊值:自身對齊值和指定對齊值中較小的那個值

(三)資料結構中的變數(成員)是按照變數定義的先後順序排放的。結構體的總大小sum,也就是sizeof的結果,必須是其內部最大成員的整數倍,不足的要補齊。

結構體位元組對齊

include pragma pack 2 struct t.pragma pack int main int argc,char argv 最後輸出的結果為 8。這個表示是按照2位元組來對齊資料,首先分配2位元組給成員變數i,分配完成後,還剩一位元組,zj add補0 沒法容納成員變數d,此時會再...

結構體位元組對齊

include pragma pack 2 struct t.pragma pack int main int argc,char argv 最後輸出的結果為 8。這個表示是按照2位元組來對齊資料,首先分配2位元組給成員變數i,分配完成後,還剩一位元組,zj add補0 沒法容納成員變數d,此時會再...

結構體位元組對齊

在用sizeof運算子求算某結構體所佔空間時,並不是簡單地將結構體中所有元素各自佔的空間相加,這裡涉及到記憶體位元組對齊的問題。從理論上講,對於任何 變數的訪問都可以從任何位址開始訪問,但是事實上不是如此,實際上訪問特定型別的變數只能在特定的位址訪問,這就需要各個變數在空間上按一定的規則排列,而不是...