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

本文為轉(zhuǎn)載,原文地址:http://11142019.blog.51cto.com/11132019/1766032

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

typedef struct student
{
}std;

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

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

typedef struct student
{
int i;
char arr[];     //柔性數(shù)組成員
}std;
sizeof(std)=4;

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

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

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

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

struct test
{
    char a1;
    short b2;
    char  c3;
    int d4;
};

因?yàn)槠渲衖nt類型所占字節(jié)最多,所以以4字節(jié)對(duì)齊,內(nèi)存分配方式如下,總共占12個(gè)字節(jié):

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

struct test
{
    char a1;
    char  c3;
    short b2;  
    int d4;
};

同樣的,以4字節(jié)對(duì)齊,總共占8個(gè)字節(jié):
這是因?yàn)閍1存到00,c3存到01,b2剛好存到02 03上,以偶數(shù)地址對(duì)齊,d4也剛好從04開始存儲(chǔ),以4字節(jié)對(duì)齊,沒有浪費(fèi)內(nèi)存。

大端字節(jié)序:高字節(jié)存儲(chǔ)在低地址,低字節(jié)存儲(chǔ)在高字節(jié)處
小端字節(jié)序:低字節(jié)存儲(chǔ)在低地址,高字節(jié)存儲(chǔ)在高地址處
計(jì)算機(jī)的最小存儲(chǔ)單位是字節(jié),一個(gè)字節(jié)占8bit位。
以int為例:
例如:1的二進(jìn)制碼是
00000000 00000000 00000000 00000001
寫成十六進(jìn)制形式 :00 00 00 01這就代表了4個(gè)字節(jié),而內(nèi)存是從低地址到高地址的,這樣就產(chǎn)生了兩種存儲(chǔ)方式。

因?yàn)榇鎯?chǔ)方式方式的不同,讀取時(shí)也就產(chǎn)生了兩種方式。
一般讀取是從低地址向高地址讀取,為了將存儲(chǔ)與讀取統(tǒng)一取來,所以采用小端存儲(chǔ),這樣的話,低字節(jié)存到低地址,高字節(jié)存到高地址。
驗(yàn)證方法:
1、可以聲明一個(gè)int a=1,再聲明一個(gè)char *p=&a;因?yàn)閍占4個(gè)字節(jié),char 一次向后訪問一個(gè)字節(jié),所以如果是小端的話在電腦上輸出p應(yīng)該是1.
2、也可以用union,因?yàn)閡nion是內(nèi)存公用,所以聲明一個(gè)int a,char c;對(duì)a賦值為1,輸出c觀察結(jié)果。
有些問題如果不考慮大小端的話是根本想不明白的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、框架 1、Mac系統(tǒng)及常用工具、進(jìn)制;C數(shù)據(jù)類型、常量變量、運(yùn)算符、表達(dá)式、格式化輸入輸出 2、關(guān)系運(yùn)算符、邏...
    師景福閱讀 836評(píng)論 0 2
  • 注:這是第三遍讀《C語言深度解剖》,想想好像自從大學(xué)開始就沒讀完過幾本書,其中譚浩強(qiáng)的那本《C語言程序設(shè)計(jì)(第四版...
    HavenXie閱讀 1,913評(píng)論 1 6
  • @[c++|struct] 今天在編程中碰到一個(gè)坑,搞的調(diào)試了半天,最后發(fā)現(xiàn)程序中在寫數(shù)據(jù)和讀取數(shù)據(jù)時(shí)結(jié)構(gòu)體定義不...
    drybeans閱讀 3,864評(píng)論 1 11
  • 文/完美的補(bǔ)丁 文字的表現(xiàn)形式實(shí)在是太多了。 文字以書信的形式出現(xiàn),它就負(fù)責(zé)傳達(dá)思念、祝...
    完美的補(bǔ)丁閱讀 346評(píng)論 3 3
  • 我認(rèn)為知識(shí)價(jià)值就是知識(shí)本身所產(chǎn)生的社會(huì)價(jià)值和擁有知識(shí)的人的社會(huì)價(jià)值與自我價(jià)值的體現(xiàn)。 自從大學(xué)改制以來,上大學(xué)更容...
    月光明媚閱讀 301評(píng)論 0 0

友情鏈接更多精彩內(nèi)容