#pragma pack(8)
//指定對齊方式:8位元組對齊
typedef
struct
student;
typedef
struct
engineer;
typedef
struct
teacher;
求:printf
("%d"
,sizeof
(student));
printf
("%d"
,sizeof
(engineer));
printf
("%d"
,sizeof
(teacher));
//答案:16,24 ,24
student:
32位的暫存器是4個位元組
首先給name分配空間,name[0]佔乙個位元組
name[1]佔乙個位元組
name[2]佔乙個位元組
給age分配空間時,age佔四個位元組,於是,char[3]為了對齊,也要佔四個位元組,於是name[0]、name[1]、name[2]各自佔乙個位元組,之後空出乙個位元組,總共占用四個位元組,然後age占用4個位元組
給score分配空間,score占用兩個32位,即8個位元組
總共占用4+4+8=16個位元組
engineer:
首先給name分配空間,name[0]佔乙個位元組
name[1]佔乙個位元組
name[2]佔乙個位元組
給score分配空間時,score佔8個位元組,於是,char[3]為了對齊,也要佔8個位元組,於是name[0]、name[1]、name[2]各自佔乙個位元組,之後空出5個位元組,總共占用8個位元組,然後score占用8個位元組
給age分配空間,為了與score對齊,占用8個位元組,空出4個位元組
總共占用8+8+8=24個位元組
teacher:
首先給name分配空間,name[0]佔乙個位元組
name[1]佔乙個位元組
name[2]佔乙個位元組
給high分配,與char對齊,占用乙個位元組,剛好把name空出的乙個位元組佔下,這個總共分配四個位元組
給score分配空間時,score佔8個位元組,於是,char[3]與high為了對齊,也要佔8個位元組,於是name[0]、name[1]、name[2]、height各自佔乙個位元組,之後空出4個位元組,總共占用8個位元組,然後score占用8個位元組
給age分配空間,為了與score對齊,占用8個位元組,空出4個位元組 總共占用8+8+8=24個位元組
總結,寫結構體的時候,把位元組占用小的資料變數寫在前面,可能會省空間
看不懂去看這篇,我感覺自己理解還是有點問題滴
結構體位元組對齊
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運算子求算某結構體所佔空間時,並不是簡單地將結構體中所有元素各自佔的空間相加,這裡涉及到記憶體位元組對齊的問題。從理論上講,對於任何 變數的訪問都可以從任何位址開始訪問,但是事實上不是如此,實際上訪問特定型別的變數只能在特定的位址訪問,這就需要各個變數在空間上按一定的規則排列,而不是...