struct字節計算

若結構體爲空,其大小爲1;
若不爲空,結構體的存儲比較複雜,並不是簡單的字節相加,比如:

struct student  
{   
    char name;  
    int id;  
    double score;  
};  

按照我們一般的想法結構體的字節數sizeof(student)=1+4+8=13,然而我們在代碼中驗證後就會發現sizeof(student)=16;這是爲什麼呢?:原來是因爲內存存儲的字節對齊 造成的。所謂的字節對齊是爲了加快計算機的處理速度,我們一般把數據類型都放在能夠被其字節大小整除的地址上。比如對於結構體student,假設此結構體的存儲首地址pt能夠被1和4,8整除(char ,int和double 的存儲字節數),其實事實上計算機也是這樣安排的,存儲過程如下:
name佔一個字節,直接存儲
id如果直接存儲,則id的存儲地址(pt+1)不會被4整除,因此我們爲了使字節對齊,就會在name後面填充3個字節然後存儲id
score直接存儲的地址可以被8整除,所以我們不用填充字節
總的字節數sizeof(student)=4+4+8=16;
爲了總結出一般的規律,我們使用偏移量這個概念:結構體成員存儲地址與結構體首地址的偏移字節數。計算結構體大小時,請按照以下準則:
1.各成員變量的偏移量必須爲該成員大小的整數倍,如不夠則在上一個變量後填充字節數
2.在所有成員計算以後,結構體的總大小—必須爲成員變量中最寬類型的整數倍,如不夠則在最後的變量後填充字節數
例:

struct teacher  
{  
   char name;  
   short age;  
   double salary;  
   int id;  
};  

name 偏移量爲0,直接存儲1個字節(已佔用1個字節)
age 若直接存儲偏移量爲1,不是2的倍數,所以在name後面填充1個字節然後存儲(已佔用4個字節)
salary 若直接存儲偏移量爲4,不是8的倍數,所以age後面填充4個字節(已佔用16個字節)
id 若直接存儲偏移量爲16,是4的倍數,所以直接存儲(已佔用20個字節)
20不是double(teacher結構體中最寬類型)字節的整數倍,所以填充4個字節使其成爲整數倍。最後得出結構體的大小爲24個字節。

結構體中包含複合類型

struct A  
{  
    char v1;  
    double  v2;  
};  
struct B  
{  
    int  v1;  
    A   v2;  
    char v3;  
};  

1.複合型變量的偏移量必須爲 該變量中最寬數據類型大小 的整數倍;
2.先將複合型變量解散爲基本變量,再尋找結構體中最寬的數據類型
3.複合類型中,結構體裏面複雜類型字節按整體存儲字節計算,但最寬數據類型是在解散爲基本變量的情況下去找。
上述例子中srtuct B:
v1偏移量爲0,是4的整數倍,直接存儲(已佔用4個字節)
v2 若直接存儲偏移量爲4,不是8(v2中最寬數據類型double字節數)的整數倍,所以在v1後填充4個字節數然後存儲(已佔用24個字節)
v3 若直接存儲偏移量爲24,是1的整數倍,直接存儲(已佔用25個字節)
25不是double(B中最寬類型)字節的整數倍,所以填充7個字節使其成爲整數倍。最後得出結構體的大小爲32個字節

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章