關於記憶體中的資料對齊

2021-05-28 14:31:44 字數 727 閱讀 3467

概念:

資料對齊指的是,資料所在的記憶體位址必須是該資料長度的整數倍。比如在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...