溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

內(nèi)存對齊,大端字節(jié)   序小端字節(jié)序驗證

發(fā)布時間:2020-08-11 12:55:53 來源:網(wǎng)絡(luò) 閱讀:551 作者:我是你帆哥 欄目:編程語言

空結(jié)構(gòu)體:對于空結(jié)構(gòu)體,就是只有結(jié)構(gòu)體這個模子,但里面卻沒有元素的結(jié)構(gòu)體。

例:

typedef struct student

{

}std;

這種空結(jié)構(gòu)體的模子占一個字節(jié),sizeof(std)=1。


柔性數(shù)組:

結(jié)構(gòu)體中最后一個元素可以是一個大小未知的數(shù)組,稱作柔性數(shù)組成員,規(guī)定柔性數(shù)組前面至少有一個元素.

typedef struct student

{

int i;

char arr[];     //柔性數(shù)組成員

}std;

sizeof(std)=4;

sizeof求取該結(jié)構(gòu)體大小是不包含柔性數(shù)組的大小,柔性數(shù)組不管有沒有大小都不計入結(jié)構(gòu)體的大小,可以通過動態(tài)內(nèi)存為它實現(xiàn)內(nèi)存分配。


內(nèi)存對齊,大端字節(jié)   序小端字節(jié)序驗證內(nèi)存對齊,大端字節(jié)   序小端字節(jié)序驗證

內(nèi)存對齊:

對于字(自然邊界是偶數(shù)地址),雙字(自然邊界是能被4整除的地址),四字(自然邊界是能被8整除的地址)本身就是對齊的。為什么要對齊呢?這是因為對于對齊的內(nèi)存只需要一次內(nèi)存訪問,對于未對齊的內(nèi)存,處理器要兩次內(nèi)存訪問。

內(nèi)存對齊,大端字節(jié)   序小端字節(jié)序驗證內(nèi)存對齊,大端字節(jié)   序小端字節(jié)序驗證

未對齊:一個字或者雙字跨越了4字節(jié)邊界,或者雙字跨越了8字節(jié)邊界,需要兩次內(nèi)存訪問。


對于結(jié)構(gòu)體,聯(lián)合體在計算其大小時要考慮其內(nèi)存對齊,以結(jié)構(gòu)中所占字節(jié)數(shù)最大的類型類型對齊。

例:

struct test

{

    char a1;

    short b2;

    char  c3;

    int d4;

};

因為其中int類型所占字節(jié)最多,所以以4字節(jié)對齊,內(nèi)存分配方式如下,總共占12個字節(jié):

內(nèi)存對齊,大端字節(jié)   序小端字節(jié)序驗證內(nèi)存對齊,大端字節(jié)   序小端字節(jié)序驗證

分析:因為以4字節(jié)對齊,首先char a1占一個字節(jié)存到00處,short b2 是字占兩個字節(jié) ,以偶數(shù)地址對齊,所以不能直接存到01 02 上,而應(yīng)該存到02 03上,而空出來的01就會被浪費掉。同理,當(dāng)char c3存到04上后,對于int i,雙字必須要存到4的倍數(shù)的地址上,就只能存到08 09 0a 0b上,空出來的05 06 07會被浪費掉。


struct test

{

    char a1;

    char  c3;

    short b2;  

    int d4;

};

同樣的,以4字節(jié)對齊,總共占8個字節(jié):

這是因為a1存到00,c3存到01,b2剛好存到02 03上,以偶數(shù)地址對齊,d4也剛好從04開始存儲,以4字節(jié)對齊,沒有浪費內(nèi)存。



大端字節(jié)序:高字節(jié)存儲在低地址,低字節(jié)存儲在高字節(jié)處

小端字節(jié)序:低字節(jié)存儲在低地址,高字節(jié)存儲在高地址處

計算機(jī)的最小存儲單位是字節(jié),一個字節(jié)占8bit位。

以int為例:

例如:1的二進(jìn)制碼是 

00000000 00000000 00000000 00000001

寫成十六進(jìn)制形式 :00 00 00 01這就代表了4個字節(jié),而內(nèi)存是從低地址到高地址的,這樣就產(chǎn)生了兩種存儲方式。

內(nèi)存對齊,大端字節(jié)   序小端字節(jié)序驗證內(nèi)存對齊,大端字節(jié)   序小端字節(jié)序驗證

因為存儲方式方式的不同,讀取時也就產(chǎn)生了兩種方式。

一般讀取是從低地址向高地址讀取,為了將存儲與讀取統(tǒng)一取來,所以采用小端存儲,這樣的話,低字節(jié)存到低地址,高字節(jié)存到高地址。

驗證方法:

1、可以聲明一個int a=1,再聲明一個char *p=&a;因為a占4個字節(jié),char *一次向后訪問一個字節(jié),所以如果是小端的話在電腦上輸出*p應(yīng)該是1.

2、也可以用union,因為union是內(nèi)存公用,所以聲明一個int a,char c;對a賦值為1,輸出c觀察結(jié)果。

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


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI