結構體的大小並不是簡單的將各元素所佔位元組相加,還要考慮位元組對齊的問題, 在此做一個總結。
雖然記憶體按位元組劃分,但在訪問特定型別變數時要在特定地址訪問,這就需要各種型別的資料按照一定規則排列,而不是按先後順序排列,這就是位元組對齊。位元組對齊有什麼作用呢,一個是某些平臺上對於沒對齊的變數進行訪問會出現錯誤,另一個是提高了存取效率。
準則
位元組對齊是由編譯器實現的,有三條準則:
- 結構體變數的首地址能被其最寬基本型別成員的大小所整除;
- 結構體每個成員相對於結構體首地址的偏移量都是成員大小的整數倍,如有需要會填充位元組;
- 結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要會在最末一個成員之後填充位元組。
大小的求法
成員都相同時
個數 x 大小
成員不同且不含其它結構體時
- 分析各個成員的大小;
- 找出最大的成員大小M(結構體的大小一定是該成員的整數倍);
- 並按最大成員大小出現的位置將結構體分為若干部分;
- 各個部分大小一次相加,求出大於該和的最小M的整數倍即為該部分大小;
- 將各個部分大小相加之和即為結構體大小;
含有其他結構體時
- 分析各個成員的大小;
- 對是結構體的成員,其大小按上面第二條來分析,且不會隨著位置的變化而變化;
- 分析各個成員的大小(成員為結構體的分析其成員大小),求出最大值;
- 若長度最大成員在為結構體的成員中,則按結構體成員為分界點分界;其他成員中有最大長度的成員,則該成員為分界點;求出各段長度,求出大於該和的最小M的整數倍即為該部分長度 ;
- 將各個部分大小相加之和即為結構體大小;
空結構體
這和編譯器有關,在C中為0,C++中為1