1.位元組對齊的原因
一些平台對某些特定型別的資料,只能從特定位址開始訪問。如有些訪問是從偶位址開始,假設int(32位)的資料存在偶位址開始,則只需要乙個週期就能拿到。但如果在奇位址開始,則除了要用2個週期讀取外,還要對高低位址進行拼湊才能得到正確的資料。顯然這是低效的。
2.一般編譯器在編譯程式時所遵循的三個原則(重要)
1)結構體變數的首位址能夠被其最寬的基本型別成員的大小所整除
2)結構體每個成員相對於結構體首位址的偏移量是該成員大小的整數倍,必要時在成員之間加上填充值
3)結構體的總大小為結構體最寬基本型別成員大小的整數倍,必要時在最後乙個成員後加上填充位元組
3.在程式設計中考慮位元組對齊
1)為了節省空間,基本原則是把結構中的變數按照型別大小由小到大宣告,儘量減少中間的填補空間。
2)顯式的進行填補空間,即在成員中插入char reserved[n]的方法占用空間,n的值為希望填補的大小。
eg:假設sizeof(int) = 4; sizeof(short) = 2;
1.
struct a加3是因為上述2.2原因sizeof(a) = sizeof(a)+3+sizeof(b)+sizeof(c)+2=12
加2是因為上述2.3原因
2.
struct b加1是因為上述2.2原因sizeof(b) = sizeof(a)+1+sizeof(c)+sizeof(b)=8;
最後什麼都沒加是因為上述2.3原因
結構體位元組對齊
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運算子求算某結構體所佔空間時,並不是簡單地將結構體中所有元素各自佔的空間相加,這裡涉及到記憶體位元組對齊的問題。從理論上講,對於任何 變數的訪問都可以從任何位址開始訪問,但是事實上不是如此,實際上訪問特定型別的變數只能在特定的位址訪問,這就需要各個變數在空間上按一定的規則排列,而不是...