記憶體對齊的原因
1、平台原因(移植原因):不是所有的硬體平台都能訪問任意位址上的任意資料的,某些硬體平台只能在某些位址處取得某些特定型別的資料,否則丟擲硬體異常。
2、效能原因:資料結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問,而對齊的記憶體訪問僅需要訪問一次。
cpu把記憶體當成是一塊一塊的,塊的大小可以是2,4,8,16 個位元組,因此cpu在讀取記憶體的時候是一塊一塊進行讀取的,塊的大小稱為(memory granularity)記憶體讀取粒度。
假設cpu要讀取乙個4位元組大小的資料到暫存器中(假設記憶體讀取粒度是4),分兩種情況討論:
1.資料從0位元組開始
2.資料從1位元組開始
當資料從0位元組開始的時候,直接將0-3四個位元組完全讀取到暫存器,結算完成了。
當資料從1位元組開始的時候,問題很複雜,首先先將前4個位元組讀到暫存器,並再次讀取4-7位元組的資料進暫存器,接著把0位元組,4,6,7位元組的資料剔除,最後合併1,2,3,4位元組的資料進暫存器,對乙個記憶體未對齊的暫存器進行了這麼多額外操作,大大降低了cpu的效能。
在c++中,乙個空類和空結構體是佔乙個位元組的空間的。在c語言中,空結構體不佔空間。
任何不同的物件不能擁有相同的記憶體位址。
記憶體對齊原則
一 記憶體對齊的原因 1 平台移植原因 不是所有的硬體平台都能任意訪問任意位址上的資料,有些硬體平台只能在某些特定位址處讀取特定的資料,否則會丟擲硬體異常 2 效能原因 資料結構 尤其是棧 應盡可能的在自然邊界對齊。原因在於,訪問未對齊的記憶體,處理器需要進行兩次訪問,而訪問對齊的記憶體,處理器只需...
記憶體對齊原則
首先由乙個程式引入話題 1 環境 vc6 windows sp22 程式13 include 45 using namespace std 6 7struct st1 8 13 14struct st2 15 20 21int main 22 27 程式的輸出結果為 sizeof st1 is 12...
記憶體對齊原則
includeusing namespace std struct a struct b int main cout 以上結構體變數數量型別相同。但是sizeof卻不同,sizeof a is 12 sizeof b is 8 那麼問題來了,為什麼兩個一樣的結構體,但是sizeof大小卻不同?答案就...