現(xiàn)代計(jì)算機(jī)中,內(nèi)存空間按照字節(jié)劃分,理論可以從任何騎術(shù)地址訪問任意類型的變量。但是實(shí)際訪問中特定類型的變量經(jīng)常在特定的內(nèi)存地址訪問,這就需要各種類型數(shù)據(jù)按照一定規(guī)則在空間上排列,而不是一個接一個地存放,這就是對齊
創(chuàng)新互聯(lián)建站,專注為中小企業(yè)提供官網(wǎng)建設(shè)、營銷型網(wǎng)站制作、響應(yīng)式網(wǎng)站開發(fā)、展示型成都網(wǎng)站制作、網(wǎng)站建設(shè)等服務(wù),幫助中小企業(yè)通過網(wǎng)站體現(xiàn)價(jià)值、有效益。幫助企業(yè)快速建站、解決網(wǎng)站建設(shè)與網(wǎng)站營銷推廣問題。對齊的原因和作用但最常見的情況是,如果不按照平臺要求對數(shù)據(jù)存放進(jìn)行對齊,會帶來存取效率上的損失。比如32位的Intel處理器通過總線訪問(包括讀和寫)內(nèi)存數(shù)據(jù)。每個總線周期從偶地址開始訪問32位內(nèi)存數(shù)據(jù),內(nèi)存數(shù)據(jù)以字節(jié)為單位存放。如果一個32位的數(shù)據(jù)沒有存放在4字節(jié)整除的內(nèi)存地址處,那么處理器就需要2個總線周期對其進(jìn)行訪問,顯然訪問效率下降很多。
因此,通過合理的內(nèi)存對齊可以提高訪問效率。為使CPU能夠?qū)?shù)據(jù)進(jìn)行快速訪問,數(shù)據(jù)的起始地址應(yīng)具有“對齊”特性。比如4字節(jié)數(shù)據(jù)的起始地址應(yīng)位于4字節(jié)邊界上,即起始地址能夠被4整除。
此外,合理利用字節(jié)對齊還可以有效地節(jié)省存儲空間。但要注意,在32位機(jī)中使用1字節(jié)或2字節(jié)對齊,反而會降低變量訪問速度。因此需要考慮處理器類型。還應(yīng)考慮編譯器的類型。在VC/C++和GNU GCC中都是默認(rèn)是4字節(jié)對齊。
結(jié)構(gòu)體對齊在C語言中,結(jié)構(gòu)體是種復(fù)合數(shù)據(jù)類型,其構(gòu)成元素既可以是基本數(shù)據(jù)類型(如int、long、float等)的變量,也可以是一些復(fù)合數(shù)據(jù)類型(如數(shù)組、結(jié)構(gòu)體、聯(lián)合等)的數(shù)據(jù)單元。編譯器為結(jié)構(gòu)體的每個成員按照其自然邊界(alignment)分配空間。各成員按照它們被聲明的順序在內(nèi)存中順序存儲,第一個成員的地址和整個結(jié)構(gòu)的地址相同。字節(jié)對齊的問題主要就是針對結(jié)構(gòu)體。
簡單示例struct A {int a;
char b;
short c;
};
struct B {char b;
int a;
short c;
};
結(jié)果:sizeof(struct A) = 8
,sizeof(struct B) = 12
結(jié)構(gòu)體A中包含一個4字節(jié)的int數(shù)據(jù),一個1字節(jié)char數(shù)據(jù)和一個2字節(jié)short數(shù)據(jù);B也一樣。按理說A和B大小應(yīng)該都是7字節(jié)。之所以出現(xiàn)上述結(jié)果,就是因?yàn)榫幾g器要對數(shù)據(jù)成員在空間上進(jìn)行對齊。
對齊規(guī)則首先了解一些基本概念:
#pragma pack(value)
時的指定對齊值value其中,有效對齊值N是最終用來決定數(shù)據(jù)存放地址方式的值。有效對齊N表示“對齊在N上”,即該數(shù)據(jù)的“存放起始地址%N=0”。而數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)變量都是按定義的先后順序存放。第一個數(shù)據(jù)變量的起始地址就是數(shù)據(jù)結(jié)構(gòu)的起始地址。結(jié)構(gòu)體的成員變量要對齊存放,結(jié)構(gòu)體本身也要根據(jù)自身的有效對齊值圓整(即結(jié)構(gòu)體成員變量占用總長度為結(jié)構(gòu)體有效對齊值的整數(shù)倍)。
字節(jié)對齊與具體編譯器相關(guān),但一般都遵循以下三條規(guī)則:
無數(shù)據(jù)成員的類(包括空類),編譯器分配1個字節(jié)的內(nèi)存空間。這樣的意義在于,創(chuàng)建的實(shí)例所指向的就是有意義的內(nèi)存空間。
如果基類無數(shù)據(jù)成員,C++標(biāo)準(zhǔn)允許派生類的第一個成員與基類共享地址,基類并沒有占據(jù)任何實(shí)際的空間。但若派生類的第一個成員類型仍然是基類,編譯器仍會為基類分配1字節(jié)的空間,這是因?yàn)镃++標(biāo)準(zhǔn)要求類型相同的對象必須地址不同。
指針的大小有關(guān)尋址范圍計(jì)算解釋,對于32位尋址的CPU,其地址值為32位的二進(jìn)制數(shù),所以可以表示的大地址為2的32次方(即4G,大內(nèi)存空間為4GB,這里G表示數(shù)量、GB表示容量)。同時我們不難看出,一個指針的值就是一個32位的二進(jìn)制數(shù),32位對應(yīng) 4字節(jié)(Byte)。所以,指針的大小實(shí)際上是由CPU的尋址位數(shù)決定,而不是字長。
參考:C/C++字節(jié)對齊規(guī)則_春日綠野的博客-博客_c++字節(jié)對齊規(guī)則
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
文章標(biāo)題:C/C++字節(jié)對齊規(guī)則-創(chuàng)新互聯(lián)
網(wǎng)站網(wǎng)址:http://www.rwnh.cn/article36/dghhsg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、移動網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、企業(yè)建站、外貿(mào)建站、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)