當前位置:學識都>好好學習>考研>

爲什麼會有內存對齊

學識都 人氣:1.25W

字,雙字,和四字在自然邊界上不需要在內存中對齊。(對字,雙字,和四字來說,自然邊界分別是偶數地址,可以被4 整除的地址,和可以被8 整除的地址。)

爲什麼會有內存對齊

無論如何,爲了提高程序的性能,數據結構(尤其是棧)應該儘可能地在自然邊界上對齊。原因在於,爲了訪問未對齊的內存,處理器需要作兩次內存訪問;然而,對齊的.內存訪問僅需要一次訪問。

一個字或雙字操作數跨越了4 字節邊界,或者一個四字操作數跨越了8 字節邊界,被認爲是未對齊的,從而需要兩次總線週期來訪問內存。

一個字起始地址是奇數但卻沒有跨越字邊界被認爲是對齊的,能夠在一個總線週期中被訪問。某些操作雙四字的指令需要內存操作數在自然邊界上對齊。如果操作數沒有對齊,這些指令將會產生一個通用保護異常。

雙四字的自然邊界是能夠被16 整除的地址。其他的操作雙四字的指令允許未對齊的訪問(不會產生通用保護異常),然而,需要額外的內存總線週期來訪問內存中未對齊的數據。

缺省情況下,編譯器默認將結構、棧中的成員數據進行內存對齊。因此,上面的程序輸出就變成了:c1 00000000, s 00000002, c2 00000004, i 00000008。

編譯器將未對齊的成員向後移,將每一個都成員對齊到自然邊界上,從而也導致了整個結構的尺寸變大。儘管會犧牲一點空間(成員之間有部分內存空閒),但提高了性能。

也正是這個原因,我們不可以斷言sizeof(TestStruct1)的結果爲8。在這個例子中,sizeof(TestStruct1)的結果爲12。

TAGS:內存 對齊