關於記憶體對齊

2021-09-30 06:09:32 字數 1808 閱讀 9995

x86機器對於word或double word的儲存時,會將低byte存在低位址,高byte存於高位址。

byte,word和double word可以開始於任何位址,並可以重疊。

對於資料匯流排是8bit的機器,不存在記憶體對齊的問題。

對於資料匯流排是16bit的機器,記憶體單元被分為even address 和odd address,cpu定址時,都是以even address來作為計數的,每次都讀出2 bytes。even address上的0~7bit對應於低位元組,odd address上的8~15bit對應於高位元組。此時,預設對齊大小為2。當乙個word是以odd address開始儲存的,那麼乙個記憶體週期即可將它讀出。但若是odd address儲存的,例如佔的是101和102位元組,則在第乙個記憶體週期內,cpu從記憶體中讀出100和101位元組,並將101位元組存於數所匯流排8~15的高8bit上。第二個時鐘週期時,再從102開始讀取2bytes,同時102位元組上的8bit存於資料匯流排0~7的低8位上。cpu會自動交換資料匯流排上的高低位元組,從而得到正確的word資料。

對於byte,如果是以2位元組對齊,則直接讀取,從資料匯流排的0~7bit上得到資料。如果不是以2位元組對齊,cpu將按位元組位址減1來定址,並將從資料匯流排8~15bit上的資料自動交換到0~7bit上。

對於double word,當以2位元組對齊時,兩個記憶體週期內可以完成讀取。如果不是以2位元組對齊,則需要3個記憶體週期。

對於資料匯流排為32bit的機器,資料匯流排和記憶體如圖1所示:

原理與資料匯流排是16bit和8bit的情況類似。

具體總參見:

再來看看記憶體對齊。

需要進行記憶體對齊的原因有兩個:

1.各個硬體平台對儲存空的處理上有很大的不同,一些平台對某些特定型別的資料只能從某些特定位址開始訪問。對內對齊是為了保證可移植性。

2.如果不按適合平台的要求對資料存放進行對齊,會在訪問資料上帶來效率上的損失。

對齊的原則:

1.資料型別自身的對齊值:

char 為1,short為2,int,float,double為4等。

2.結構體或者類的自身對齊值:

其成員中自身對齊值最大的那個值。

3.指定對齊值:

#pragma pack(value)時的指定對齊值(vlaue);

#pragma pack () 取消自定義對齊方式;

__attribute ( (aligned (n))) 所作用的結構成員對齊在n位元組自然邊界上,如果結構中有成員的長度大於n,則按照最大成員長度來對齊;

__attibute__((packed))取消結構在編譯過程的優化對齊,按照實際占用位元組數對齊。

4.資料成員、類或結構體的有效對齊值:

自身對齊值與指定對齊值中小的那個。

有效對齊值n最終用來決定資料存放位址方式的值,有效對齊值n,就是表示對齊在n上。也就是說,資料的存放起始位址%n=0。

結構體中的成員變數要對齊排放,結構體本身也要根據自身的有效對齊值圓整。

舉個例子:

struct b

假設b從位址空間0x0000開始排列,系統預設對齊值是4。b的對齊值為1,比指定或缺省對齊值小,所以其有效對齊值為1,存放位址0x0000%1=0符合要求。 第二個變數a的對齊值為4,預設對齊值也為4,所以其有效對齊值為4,也因為要存放在0x0004到0x0007這四個位元組的位址空間上。第三個變數c,有效對齊值為2,所以存放在0x0008和0x0009這兩個位元組上。再看b,它自身的對齊值為其成員中最大對齊值,是b的4,所以結構體的有效對齊值也是4,為使結構圓整,b要是有效對齊值的整數倍,所以補0x0010和0x0011給結構b占用。(其實這是為結構陣列考慮的)

具體請參考:

關於記憶體對齊

資料傳送到網路板的資料報大小根本不是實際控制數 據包的大小 這時我才想起乙個人,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...

關於記憶體對齊

資料傳送到網路板的資料報大小根本不是實際控制資料報的大小 這時我才想起乙個人,stanley b.lippman,他寫的那一本書 inside object modale 曾經提過這樣的事情,編譯器為了提高cpu的效率,會對struct 的結構進行優化,利用sizeof 可以得出不同的計算機上對 s...