您好,登錄后才能下訂單哦!
空結構體:對于空結構體,就是只有結構體這個模子,但里面卻沒有元素的結構體。
例:
typedef struct student
{
}std;
這種空結構體的模子占一個字節,sizeof(std)=1。
柔性數組:
結構體中最后一個元素可以是一個大小未知的數組,稱作柔性數組成員,規定柔性數組前面至少有一個元素.
typedef struct student
{
int i;
char arr[]; //柔性數組成員
}std;
sizeof(std)=4;
sizeof求取該結構體大小是不包含柔性數組的大小,柔性數組不管有沒有大小都不計入結構體的大小,可以通過動態內存為它實現內存分配。
內存對齊:
對于字(自然邊界是偶數地址),雙字(自然邊界是能被4整除的地址),四字(自然邊界是能被8整除的地址)本身就是對齊的。為什么要對齊呢?這是因為對于對齊的內存只需要一次內存訪問,對于未對齊的內存,處理器要兩次內存訪問。
未對齊:一個字或者雙字跨越了4字節邊界,或者雙字跨越了8字節邊界,需要兩次內存訪問。
對于結構體,聯合體在計算其大小時要考慮其內存對齊,以結構中所占字節數最大的類型類型對齊。
例:
struct test
{
char a1;
short b2;
char c3;
int d4;
};
因為其中int類型所占字節最多,所以以4字節對齊,內存分配方式如下,總共占12個字節:
分析:因為以4字節對齊,首先char a1占一個字節存到00處,short b2 是字占兩個字節 ,以偶數地址對齊,所以不能直接存到01 02 上,而應該存到02 03上,而空出來的01就會被浪費掉。同理,當char c3存到04上后,對于int i,雙字必須要存到4的倍數的地址上,就只能存到08 09 0a 0b上,空出來的05 06 07會被浪費掉。
struct test
{
char a1;
char c3;
short b2;
int d4;
};
同樣的,以4字節對齊,總共占8個字節:
這是因為a1存到00,c3存到01,b2剛好存到02 03上,以偶數地址對齊,d4也剛好從04開始存儲,以4字節對齊,沒有浪費內存。
大端字節序:高字節存儲在低地址,低字節存儲在高字節處
小端字節序:低字節存儲在低地址,高字節存儲在高地址處
計算機的最小存儲單位是字節,一個字節占8bit位。
以int為例:
例如:1的二進制碼是
00000000 00000000 00000000 00000001
寫成十六進制形式 :00 00 00 01這就代表了4個字節,而內存是從低地址到高地址的,這樣就產生了兩種存儲方式。
因為存儲方式方式的不同,讀取時也就產生了兩種方式。
一般讀取是從低地址向高地址讀取,為了將存儲與讀取統一取來,所以采用小端存儲,這樣的話,低字節存到低地址,高字節存到高地址。
驗證方法:
1、可以聲明一個int a=1,再聲明一個char *p=&a;因為a占4個字節,char *一次向后訪問一個字節,所以如果是小端的話在電腦上輸出*p應該是1.
2、也可以用union,因為union是內存公用,所以聲明一個int a,char c;對a賦值為1,輸出c觀察結果。
有些問題如果不考慮大小端的話是根本想不明白的。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。