1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      需要字節(jié)對(duì)齊的原因有哪些

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

      創(chuàng)新互聯(lián)長期為近1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(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)和眾多成功案例,為您定制開發(fā)。

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

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

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

      計(jì)算機(jī)是通過總線來訪問內(nèi)存的,而總線的寬度一般是32位或者64位,假設(shè)是32位總線,每個(gè)總線周期,計(jì)算機(jī)都會(huì)從偶地址開始訪問32位內(nèi)存數(shù)據(jù)。如果一個(gè)32位的數(shù)據(jù)沒有存放在4字節(jié)整除的內(nèi)存地址處,那么處理器就需要2個(gè)總線周期才能對(duì)其進(jìn)行訪問,自然會(huì)降低訪問的效率。所以,為了使CPU能夠?qū)?shù)據(jù)進(jì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,是最終用來決定數(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)體成員變量占用總長度為結(jié)構(gòu)體有效對(duì)齊值的整數(shù)倍,以便對(duì)結(jié)構(gòu)體數(shù)據(jù)進(jì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)體開辟空間時(shí),首先找到結(jié)構(gòu)體中最寬的基本數(shù)據(jù)類型,然后尋找內(nèi)存地址能被該基本數(shù)據(jù)類型所整除的位置,作為結(jié)構(gòu)體的首地址。將這個(gè)最寬的基本數(shù)據(jù)類型的大小作為上面介紹的對(duì)齊模數(shù)。

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

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

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

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

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

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

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

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

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

      64位機(jī)一般默認(rèn)8字節(jié)對(duì)齊(64位機(jī)機(jī)器字長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ì)齊的長度。

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

      到此,關(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ī)砀鄬?shí)用的文章!


      分享文章:需要字節(jié)對(duì)齊的原因有哪些
      文章來源:http://ef60e0e.cn/article/psppgg.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        政和县| 海淀区| 游戏| 隆子县| 体育| 奉节县| 东宁县| 营口市| 西吉县| 师宗县| 民县| 阳高县| 老河口市| 香河县| 哈密市| 绥芬河市| 咸丰县| 吕梁市| 平南县| 巧家县| 嵊州市| 堆龙德庆县| 兴山县| 罗定市| 吉首市| 陈巴尔虎旗| 新平| 潍坊市| 绵竹市| 高碑店市| 丰台区| 房山区| 潍坊市| 张北县| 阳谷县| 周宁县| 晋宁县| 平乡县| 宜宾市| 自治县| 中牟县|