記憶體對齊 大端位元組,序小端位元組序驗證

2021-07-11 18:56:18 字數 1820 閱讀 3247

空結構體:對於空結構體,就是只有結構體這個模子,但裡面卻沒有元素的結構體。

例:typedef struct student

std;

這種空結構體的模子佔乙個位元組,sizeof(std)=1。

柔性陣列:

結構體中最後乙個元素可以是乙個大小未知的陣列,稱作柔性陣列成員,規定柔性陣列前面至少有乙個元素.

typedef struct student

std;

sizeof(std)=4;

sizeof求取該結構體大小是不包含柔性陣列的大小,柔性陣列不管有沒有大小都不計入結構體的大小,可以通過動態記憶體為它實現記憶體分配。

記憶體對齊:

對於字(自然邊界是偶數字址),雙字(自然邊界是能被4整除的位址),四字(自然邊界是能被8整除的位址)本身就是對齊的。為什麼要對齊呢?這是因為對於對齊的記憶體只需要一次記憶體訪問,對於未對齊的記憶體,處理器要兩次記憶體訪問。

未對齊:乙個字或者雙字跨越了4位元組邊界,或者雙字跨越了8位元組邊界,需要兩次記憶體訪問。

對於結構體,聯合體在計算其大小時要考慮其記憶體對齊,以結構中所佔位元組數最大的型別型別對齊。 例:

struct test ;

因為其中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 ;

同樣的,以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觀察結果。

有些問題如果不考慮大小端的話是根本想不明白的。

大端位元組序 小端位元組序

大端位元組序 大端儲存模式是指資料的低位元組內容儲存到記憶體的高位址中,而資料的高位元組內容儲存到記憶體的低位址中 小端位元組序 小端儲存模式是指資料的低位元組內容儲存到記憶體的低位址中,而資料的高位元組內容儲存到記憶體的高位址中 程式驗證 include int main return 0 程式改...

大端位元組序 小端位元組序(網路位元組序 主機位元組序)

大端位元組序 整數的高位位元組儲存在記憶體的低位址處,低位元組儲存在記憶體的高位址處。一般pc大多採用小端位元組序,也稱為主機位元組序。網路上傳輸採用大端位元組序,也稱為網路位元組序。linux中常用轉換函式如下 include uint32 t htonl uint32 t hostlong 無符...

小端位元組序與大端位元組序

端模式分為 小端位元組序和大端位元組序,也就是位元組在記憶體中的順序。小端位元組序 低位元組存於記憶體低位址 高位元組存於記憶體高位址。如乙個long型資料0x12345678 0x0029f458 0x78 0x0029f459 0x56 0x0029f45a 0x34 0x0029f45b 0x...