内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

C語言中的字節(jié)對齊-創(chuàng)新互聯(lián)

編輯中……

為崇禮等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及崇禮網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為做網(wǎng)站、成都網(wǎng)站制作、崇禮網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

字節(jié)對齊是一種軟件層面上的操作,我們編寫的C語言程序,并不能直接被硬件平臺識別,要先由編譯器將代碼編譯成匯編代碼,然后再使用匯編器將匯編代碼轉(zhuǎn)換成機器代碼,機器代碼才是硬件能夠識別并執(zhí)行的代碼。因此,字節(jié)對齊是通過軟件層面的編譯器和匯編器實現(xiàn)的,通過指定數(shù)據(jù)在內(nèi)存中的起始地址來實現(xiàn)字節(jié)對齊,我們可以在C程序中使用相應的指令或在編譯時更改編譯器的編譯選項來更改字節(jié)對齊的方式。但是,請注意,在編譯器和匯編器將代碼轉(zhuǎn)換成機器代碼時,可能會考慮硬件的限制,并調(diào)整字節(jié)對齊方式以滿足硬件的要求。

字節(jié)對齊是指將數(shù)據(jù)存儲在內(nèi)存中時,數(shù)據(jù)的起始地址與某個值(稱為對齊值)的倍數(shù)對齊。對齊值通常是2的冪次方,例如1、2、4、8等。例如,如果采用4字節(jié)對齊,則將數(shù)據(jù)存儲到內(nèi)存中時分配到的地址總是4的倍數(shù)。值得注意的是,非常不建議使用2的冪次方以外的對齊值,因為C語言中的數(shù)據(jù)類型占據(jù)的字節(jié)大小都是2的冪次方,如char、int,使用3字節(jié)等非2的冪次方對齊值的話,內(nèi)存碎片將無法避免。

接下來讓我們想想,為什么要這么做?

盡管CPU可以從任意內(nèi)存地址讀取數(shù)據(jù),但是對于一些CPU架構(gòu),從對齊的內(nèi)存地址讀取數(shù)據(jù)可能比從不對齊的內(nèi)存地址讀取數(shù)據(jù)要快得多(順帶一提,ARM的Cortex-M系列內(nèi)核在Cortex-M3出現(xiàn)之前都不支持非對其訪問)。因此,為了提高數(shù)據(jù)訪問速度,在一些情況下,程序員可能會希望進行字節(jié)對齊,即使CPU本身可以從任意內(nèi)存地址讀取數(shù)據(jù)。

因此,為了提高數(shù)據(jù)訪問速度,在一些情況下,程序員可能會希望進行字節(jié)對齊。但是,請注意,字節(jié)對齊并不總是必要的,并且還可能會增加內(nèi)存使用量。因此,在決定是否進行字節(jié)對齊時,應考慮系統(tǒng)的具體情況,并在必要時才進行字節(jié)對齊。

字節(jié)對齊的目的是為了提高存儲器訪問的效率,因為處理器在訪問內(nèi)存時通常會以固定大小的字(如 4 字節(jié)或 8 字節(jié))為單位進行讀寫。如果內(nèi)存地址不是字的邊界,處理器就必須進行額外的操作來確定所需的內(nèi)存位置。

? 例如,在一個 32 位系統(tǒng)中,通常情況下 CPU 會從內(nèi)存中一次性取出一個字(word)的數(shù)據(jù),一個字的大小通常為 32 位(也有一些32位系統(tǒng)的字的大小為 64位或16 位,64位相較于16位常見得多)。這種情況下,系統(tǒng)一般采用的是4字節(jié)對齊。當 CPU 訪問一個 char 類型的數(shù)據(jù)時,它會從內(nèi)存中取出一個字的數(shù)據(jù),然后將其中不需要的24位視為無效數(shù)據(jù)。顯然,對于char類型這種一字節(jié)大小的數(shù)據(jù),不管它的地址是有沒有進行字節(jié)對齊,CPU都只用進行一次讀取操作,就能得到它的值。那么如果要讀取的數(shù)據(jù)大小為4字節(jié)呢?假設在這個32位系統(tǒng)中,long類型數(shù)據(jù)占據(jù)4個字節(jié),現(xiàn)在我們要讀取一個long類型的數(shù)據(jù),且它的地址沒有進行字節(jié)對齊,為0x03,那么CPU要想讀取數(shù)據(jù)就必須從地址0x00處開始讀取四個字節(jié),取得0x03處的這個long型數(shù)據(jù)的低字節(jié)(小端存儲),從0x04開始讀取四個字節(jié),取得這個long型數(shù)據(jù)的高字節(jié),要進行兩次讀取操作。

在 C 語言中,可以使用 #pragma pack 指令來控制結(jié)構(gòu)體、數(shù)組或其他內(nèi)存塊的字節(jié)對齊方式。例如,可以使用以下語句來將結(jié)構(gòu)體的字節(jié)對齊方式調(diào)整為 4 字節(jié)對齊:

#pragma pack(4) //從這之后定義的結(jié)構(gòu)體采用4字節(jié)對齊
struct mystruct {
   int a;    //地址偏移:0
   char b;   //地址偏移:4
   short c;  //地址偏移:8
}; //這個結(jié)構(gòu)體大小為10字節(jié)(假設這個系統(tǒng)的short為2字節(jié),int為4字節(jié))
#pragma pack()  //從這之后恢復默認的對齊方式

在這個例子中,mystruct 結(jié)構(gòu)體的字節(jié)對齊方式被調(diào)整為 4 字節(jié)對齊。這意味著 mystruct 結(jié)構(gòu)體的起始地址必須是 4 的倍數(shù),并且結(jié)構(gòu)體中的所有字段都必須相對于起始地址對齊到 4 的倍數(shù)上。

對于數(shù)組:

#pragma pack(4)
char a[3];
#pragma pack()

即使采用4字節(jié)對齊方式,數(shù)組 a 中的每個元素仍然會占用 1 個字節(jié)的內(nèi)存空間,但是數(shù)組 a 的起始地址將調(diào)整為 4 的倍數(shù)。這葉符合數(shù)組說一片連續(xù)的內(nèi)存空間的定義。因此,在4字節(jié)對齊下,數(shù)組 a 的內(nèi)存分布情況可能會如下所示:

內(nèi)存地址內(nèi)存值
0x0004a[0]
0x0005a[1]
0x0006a[2]

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

當前文章:C語言中的字節(jié)對齊-創(chuàng)新互聯(lián)
文章源于:http://www.rwnh.cn/article18/cojhgp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、動態(tài)網(wǎng)站、網(wǎng)站改版、外貿(mào)建站、網(wǎng)站排名定制網(wǎng)站

廣告

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

h5響應式網(wǎng)站建設
彩票| 文成县| 南漳县| 兰溪市| 大新县| 定州市| 利辛县| 仁化县| 虎林市| 兴化市| 苏尼特右旗| 东海县| 祥云县| 南部县| 梁山县| 西丰县| 尚义县| 增城市| 宝丰县| 长丰县| 沈阳市| 珠海市| 荣成市| 沙河市| 萨嘎县| 鲁山县| 衡阳县| 济阳县| 姜堰市| 台北市| 合江县| 大港区| 英山县| 杭锦旗| 禹州市| 常宁市| 彝良县| 双桥区| 潜江市| 三门峡市| 太谷县|