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