成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

需要字節(jié)對(duì)齊的原因有哪些

這篇文章主要介紹“需要字節(jié)對(duì)齊的原因有哪些”,在日常操作中,相信很多人在需要字節(jié)對(duì)齊的原因有哪些問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”需要字節(jié)對(duì)齊的原因有哪些”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

創(chuàng)新互聯(lián)長(zhǎng)期為近1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為江陰企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè),江陰網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

字節(jié)對(duì)齊

現(xiàn)代計(jì)算的內(nèi)存是以字節(jié)來(lái)劃分的,理論上可以計(jì)算機(jī)可以從任意地址開(kāi)始訪問(wèn)任意的變量。但實(shí)際中,計(jì)算機(jī)在訪問(wèn)特定類型變量時(shí),經(jīng)常從特定的內(nèi)存地址訪問(wèn),這就需要各種類型數(shù)據(jù)按照一定的規(guī)則在空間上排列,這個(gè)規(guī)則,就叫做內(nèi)存對(duì)齊。

需要字節(jié)對(duì)齊的原因

計(jì)算機(jī)是通過(guò)總線來(lái)訪問(wèn)內(nèi)存的,而總線的寬度一般是32位或者64位,假設(shè)是32位總線,每個(gè)總線周期,計(jì)算機(jī)都會(huì)從偶地址開(kāi)始訪問(wèn)32位內(nèi)存數(shù)據(jù)。如果一個(gè)32位的數(shù)據(jù)沒(méi)有存放在4字節(jié)整除的內(nèi)存地址處,那么處理器就需要2個(gè)總線周期才能對(duì)其進(jìn)行訪問(wèn),自然會(huì)降低訪問(wèn)的效率。所以,為了使CPU能夠?qū)?shù)據(jù)進(jìn)行快速訪問(wèn),數(shù)據(jù)的起始地址應(yīng)具有“對(duì)齊”特性。比如4字節(jié)數(shù)據(jù)的起始地址應(yīng)位于4字節(jié)邊界上,即起始地址能夠被4整除。

字節(jié)對(duì)齊的分類

字節(jié)對(duì)齊分為兩種:

  • 結(jié)構(gòu)體對(duì)齊,結(jié)構(gòu)體對(duì)齊是字節(jié)對(duì)齊的主要對(duì)象。

  • 棧對(duì)齊,函數(shù)中的局部變量也需要對(duì)齊,一般按照4字節(jié)對(duì)齊。

結(jié)構(gòu)體字節(jié)對(duì)齊

編譯器為結(jié)構(gòu)體的每個(gè)成員按照其自然邊界分配空間。

各成員按照他們被聲明的順序在內(nèi)存中順序的存儲(chǔ)。

第一個(gè)成員的地址和整個(gè)結(jié)構(gòu)體的地址相同。

結(jié)構(gòu)體對(duì)齊的4個(gè)基本概念

1) 數(shù)據(jù)類型自身的對(duì)齊值:char型數(shù)據(jù)自身對(duì)齊值為1字節(jié),short型數(shù)據(jù)為2字節(jié),int/float型為4字節(jié),double型為8字節(jié)。
2) 結(jié)構(gòu)體或類的自身對(duì)齊值:其成員中自身對(duì)齊值最大的那個(gè)值。
3) 指定對(duì)齊值:#pragma pack (value)時(shí)的指定對(duì)齊值value。
4) 數(shù)據(jù)成員、結(jié)構(gòu)體和類的有效對(duì)齊值:自身對(duì)齊值和指定對(duì)齊值中較小者,即有效對(duì)齊值=min{自身對(duì)齊值,當(dāng)前指定的pack值}。

期中,有效對(duì)其值N,是最終用來(lái)決定數(shù)據(jù)存放地址方式的值。有效對(duì)其N表示“對(duì)齊在N上”,即該數(shù)據(jù)的“存放起始地址%N=0”。而數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)變量都是按定義的先后順序存放。第一個(gè)數(shù)據(jù)變量的起始地址就是數(shù)據(jù)結(jié)構(gòu)的起始地址。結(jié)構(gòu)體的成員變量要對(duì)齊存放,結(jié)構(gòu)體本身也要根據(jù)自身的有效對(duì)齊值圓整(即結(jié)構(gòu)體成員變量占用總長(zhǎng)度為結(jié)構(gòu)體有效對(duì)齊值的整數(shù)倍,以便對(duì)結(jié)構(gòu)體數(shù)據(jù)進(jìn)行高效的訪問(wèn))。

結(jié)構(gòu)體對(duì)齊的3個(gè)基本準(zhǔn)則

1) 結(jié)構(gòu)體變量的首地址能夠被其最寬基本類型成員的大小所整除;
2) 結(jié)構(gòu)體每個(gè)成員相對(duì)結(jié)構(gòu)體首地址的偏移量(offset)都是成員大小的整數(shù)倍,如有需要編譯器會(huì)在成員之間加上填充字節(jié)(internal adding);
3) 結(jié)構(gòu)體的總大小為結(jié)構(gòu)體最寬基本類型成員大小的整數(shù)倍,如有需要編譯器會(huì)在最末一個(gè)成員之后加上填充字節(jié){trailing padding}。

第一條:編譯器在給結(jié)構(gòu)體開(kāi)辟空間時(shí),首先找到結(jié)構(gòu)體中最寬的基本數(shù)據(jù)類型,然后尋找內(nèi)存地址能被該基本數(shù)據(jù)類型所整除的位置,作為結(jié)構(gòu)體的首地址。將這個(gè)最寬的基本數(shù)據(jù)類型的大小作為上面介紹的對(duì)齊模數(shù)。

第二條:為結(jié)構(gòu)體的一個(gè)成員開(kāi)辟空間之前,編譯器首先檢查預(yù)開(kāi)辟空間的首地址相對(duì)于結(jié)構(gòu)體首地址的偏移是否是本成員大小的整數(shù)倍,若是,則存放本成員,反之,則在本成員和上一個(gè)成員之間填充一定的字節(jié),以達(dá)到整數(shù)倍的要求,也就是將預(yù)開(kāi)辟空間的首地址后移幾個(gè)字節(jié)。

第三條:結(jié)構(gòu)體總大小是包括填充字節(jié),最后一個(gè)成員滿足上面兩條以外,還必須滿足第三條,否則就必須在最后填充幾個(gè)字節(jié)以達(dá)到本條要求。

不同處理器間的數(shù)據(jù)通信

在不同編譯平臺(tái)或處理器上,字節(jié)對(duì)齊會(huì)造成消息結(jié)構(gòu)長(zhǎng)度的變化。

編譯器為了使字節(jié)對(duì)齊可能會(huì)對(duì)消息結(jié)構(gòu)體進(jìn)行填充,不同編譯平臺(tái)可能填充為不同的形式,大大增加處理器間數(shù)據(jù)通信的風(fēng)險(xiǎn)。 

為了解決上述問(wèn)題,可以按如下方案進(jìn)行操作:

1)對(duì)于本地使用的數(shù)據(jù)結(jié)構(gòu),為提高內(nèi)存訪問(wèn)效率,采用四字節(jié)對(duì)齊方式;
同時(shí)為了減少內(nèi)存的開(kāi)銷,合理安排結(jié)構(gòu)體成員的位置,減少四字節(jié)對(duì)齊導(dǎo)致的成員之間的空隙,降低內(nèi)存開(kāi)銷。
2)對(duì)于處理器之間的數(shù)據(jù)結(jié)構(gòu),需要保證消息長(zhǎng)度不會(huì)因不同編譯平臺(tái)或處理器而導(dǎo)致消息結(jié)構(gòu)體長(zhǎng)度發(fā)生變化,使用一字節(jié)對(duì)齊方式對(duì)消息結(jié)構(gòu)進(jìn)行緊縮;
為保證處理器之間的消息數(shù)據(jù)結(jié)構(gòu)的內(nèi)存訪問(wèn)效率,采用字節(jié)填充的方式自己對(duì)消息中成員進(jìn)行四字節(jié)對(duì)齊。
3)數(shù)據(jù)結(jié)構(gòu)的成員位置要兼顧成員之間的關(guān)系、數(shù)據(jù)訪問(wèn)效率和空間利用率。
順序安排原則是:四字節(jié)的放在最前面,兩字節(jié)的緊接最后一個(gè)四字節(jié)成員,一字節(jié)緊接最后一個(gè)兩字節(jié)成員,填充字節(jié)放在最后。

默認(rèn)的字節(jié)對(duì)齊方式

32位機(jī)一般默認(rèn)4字節(jié)對(duì)齊(32位機(jī)機(jī)器字長(zhǎng)4字節(jié)),

64位機(jī)一般默認(rèn)8字節(jié)對(duì)齊(64位機(jī)機(jī)器字長(zhǎng)8字節(jié)) 。

更改字節(jié)對(duì)齊的方式

  • 使用偽指令#pragma pack(n):C編譯器將按照n個(gè)字節(jié)對(duì)齊;

  • 使用偽指令#pragma pack(): 取消自定義字節(jié)對(duì)齊方式。

字節(jié)對(duì)齊的方式與sizeof的值

不同的字節(jié)對(duì)齊方式,可能影響sizeof的值,在使用sizeof的時(shí)候,要認(rèn)證考慮當(dāng)前字節(jié)對(duì)齊的長(zhǎng)度。

在進(jìn)行網(wǎng)絡(luò)通信的時(shí)候,往往需要傳輸一塊buffer,這個(gè)buffer的長(zhǎng)度,一定要顯示指定,解析的時(shí)候也必須使用這個(gè)長(zhǎng)度。

到此,關(guān)于“需要字節(jié)對(duì)齊的原因有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

標(biāo)題名稱:需要字節(jié)對(duì)齊的原因有哪些
分享路徑:http://jinyejixie.com/article16/psppgg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、網(wǎng)站排名網(wǎng)站設(shè)計(jì)公司、App設(shè)計(jì)、關(guān)鍵詞優(yōu)化、營(yíng)銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司
台州市| 和田市| 北票市| 伊金霍洛旗| 衡东县| 夏津县| 嘉定区| 札达县| 临湘市| 谢通门县| 文水县| 江孜县| 宜兴市| 济阳县| 阳谷县| 巴塘县| 新密市| 杭州市| 杭州市| 巴里| 株洲市| 桂平市| 保靖县| 辉南县| 古蔺县| 清远市| 高台县| 区。| 讷河市| 额敏县| 雷山县| 郑州市| 古丈县| 惠来县| 青神县| 临洮县| 乌拉特前旗| 泌阳县| 银川市| 合江县| 山丹县|