結構體位元組對齊

2022-09-08 03:09:12 字數 1364 閱讀 5204

#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運算子求算某結構體所佔空間時,並不是簡單地將結構體中所有元素各自佔的空間相加,這裡涉及到記憶體位元組對齊的問題。從理論上講,對於任何 變數的訪問都可以從任何位址開始訪問,但是事實上不是如此,實際上訪問特定型別的變數只能在特定的位址訪問,這就需要各個變數在空間上按一定的規則排列,而不是...