概念:
資料對齊指的是,資料所在的記憶體位址必須是該資料長度的整數倍。比如在32位機中int 所在的記憶體起始位址能被4整除,short可以被2正處,double被8整除。
為什麼要進行資料對齊?
x86cpu能直接訪問對齊的資料,當它試圖訪問乙個未對齊的資料時,會在內部進行一系列的調整,這些調整對程式來說是透明的,但是會降低執行速度,所以編譯器在編譯程式時會盡量保證讓資料對齊。對於訪問記憶體的硬體電路,位址匯流排總是按照對齊後的位址來訪問的。假如你想得到0x00000001處的4位元組內容,系統首先需要以0x00000000讀4位元組,從中取得3位元組,在用0x00000004作為開始位址獲得下乙個4位元組,再從中獲得1位元組,將兩者組合出想得到的內容, 但是若一開始就對齊到0x00000000,則系統只需要讀取一次即可。可見對齊對於效率的重要性。
結構體中成員的對齊原則:(vc環境編譯器)
保證每個成員的起始位址是該成員長度的整數倍;結構體總長度必須是最大長度成員的整數倍。
幾個典型例子:
struct _aa;
struct b;
typedef struct _cc;
struct _d;
typedef struct _d d;
void main(){
cout<
輸出為:8,12,16,6.
記憶體中的資料對齊
為何要位元組對齊 簡單來說就是提高cpu對記憶體的訪問效率。為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問 然而,對齊的記憶體訪問僅需要一次訪問。比如有些平台每次讀都是從偶位址開始,如果乙個int型 假設為32位系統 存放在偶位址開始的地方 那麼讀乙個週期就可以讀出這32bit,而如果存放在奇位...
關於記憶體對齊
資料傳送到網路板的資料報大小根本不是實際控制數 據包的大小 這時我才想起乙個人,stanley b.lippman,他寫的那 一本書 inside object modale 曾經提過這樣的事 情,編譯器為了提高cpu的效率,會對struct 的結構進行優化,利用sizeof 可以得出不同的計算機上...
關於記憶體對齊
早上看了乙個貼的面試題,struct st int i short s char c sizeof struct st 是多少?int 4,short 2,char 1,但是sizeof st 是8。這個就是記憶體對齊 再來看個例子 struct strt1 strt1 s1 假設s1.c1位址為0...