要了解為什麼要記憶體對齊,首先我們要了解什麼是記憶體對齊
typedef struct a;
typedef struct b;
分別對他們求大小,sizeof(a),sizeof(b)我們所得到的結果是不同的,
sizeof(a)=24而sizeof(b)=16為什麼會產生不一樣的結果呢?
這是非常簡單的乙個例子,體現了結構體的記憶體對齊規則。
在結構體中,從結構體的首位址開始,假設位址從0開始。
對結構體a來說,a佔4個位元組,佔從0~3的位元組,b是double型別佔8個位元組,佔從8~15的位元組,c佔兩個位元組,從16~17的位元組。
對結構體b來說,a佔4個位元組,從0~3,b佔兩個位元組從4~6;c佔8個位元組從8~15。
這就是記憶體對齊,對齊規則是按照成員的宣告順序,依次安排記憶體,其偏移量為成員大小的整數倍,0看做任何成員的整數倍,最後結構體的大小為最大成員的整數倍(所以這裡的a的大小是24,而不是18)。
c語言和c++中空類和空結構體的大小
在c++中規定了空結構體和空類的記憶體所佔大小為1位元組,因為c++中規定,任何不同的物件不能擁有相同的記憶體位址。
而在c語言中,空的結構體在記憶體中所佔大小為0。(gcc中測試為0,其他編譯器不一定)
為什麼要記憶體對齊?
2.效能原因:資料結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問;而對齊的記憶體訪問僅需要一次訪問。
為什麼要記憶體對齊
當我們聽到 記憶體對齊 這個概念時,從字面意思來看,很容易理解。那就是讓記憶體按一定規則對齊。當然 就會有人說 你這不是廢話 現在我就來說一說為什麼要記憶體對齊以及怎麼個對齊法 如何對齊 記憶體對齊 記憶體對齊 應該是 編譯器的 管轄範圍 編譯器為程式中的每個 資料單元 對於記憶體對齊問題,主要存在...
為什麼要記憶體對齊?
cpu訪問非對齊的記憶體時為何需要多次讀取再拼接?首先簡單說一下何為記憶體對齊。例如,當cpu需要取4個連續的位元組時,若記憶體起始位置的位址可以被4整除,那麼我們稱其對齊訪問。反之,則為未對齊訪問。比如從位址0xf1取4位元組就是非對齊 位址 訪問。簡單的看來,對於乙個資料匯流排寬度為32位的cp...
什麼是位元組對齊,為什麼要位元組對齊。
一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的作...