计算结构体的大小
結構體是用戶建立由不同類型數據組成的組合型數據結構。
結構體的大小不是簡單地數據類型的相加,而是需要考慮到系統在存儲結構體變量時的地址對齊問題。
(1)結構體成員或者加上偏移量必須是下一個成員大小的整數倍
(2)結構體大小必須是最大成員大小的整數倍
struct A
{
?? ?int a; //4
?? ?float b;//4
};//8
int類型占4個字節,剛好是float類型的整數倍,這個結構體就直接相加就可以了。
struct B
{
?? ?char a;//1+3
?? ?int b;//4
};//8
因為char類型只占一個字節,int類型占4個字節,所以要偏移3個字節才是int的倍數,所以總共是8個字節
struct C
{
?? ?char a;//1+1
?? ?short b;//2
?? ?int c;//4
};//8
char類型占一個字節,short占兩個字節,偏移量為1,相加為4,int類型占4個字節,4剛好是4的倍數,所以總共是8個字節
struct D
{
?? ?char a;//1+3
?? ?int b;//4
?? ?short c;//2
};//10+2
char占一個字節,偏移3個字節,是int的整數倍,short占兩個字節,總共是10字節,但是結構體總大小必須是最長類型大小的整數倍,所以再偏移兩個字節,一共為12個字節。
PS:struct C 和 srcuct D 存儲的類型都是int,short和char類型,但是一個是8個字節,一個是12個字節,這就需要用戶在定義時注意類型的排列問題,注意內存的使用空間。
struct II
{
?? ?int a;///4
?? ?char b;//1+3
};//8
struct I
{
?? ?float x;//4
?? ?struct II y;//8
};//12 ?
struct II 的大小為8個字節,struct I 的大小為float(4)加上struct II 的大小(8)為12個字節。之所以不是16個字節是因為只需要遵循是最大單個類型的整數倍就可以了。
?
?
?
總結
- 上一篇: php 上传根目录不存在,Linux 下
- 下一篇: android如何适配平板,适用于平板电