再談記憶體對齊

2021-09-30 07:30:27 字數 1194 閱讀 1083

一、問題提出

怎樣的資料訪問是對齊的?很簡單

aligned: c記憶體位址%資料大小 ==0;自然對齊

unaligned:不滿足上述規則,這個資料是非對齊的

簡單的說,就是char型別無對齊要求;short型別的資料位址最後一位是0;int型資料位址最後兩位為0;

非對齊訪問對x86//sparc這類晶元會導致訪問開銷問題,對於arm/mip/acpha/ia-64這類cpu會導致異常。

本文的所有討論基於32位的risc/cisc cpu和gcc編譯器

二、對齊處理

記憶體對齊的幾個處理場景:

1.cpu自動對齊

2.編譯器模擬對齊訪問

3.os處理對齊

4.結構體的對齊問題

5.malloc的對齊問題

malloc明顯存在記憶體對齊問題,因為其返回的型別位址總會轉換需要的指標型別;所以,malloc函式返回的位址總是適當對齊的,使它可以在各種情況下使用,vc採用8位元組對齊。

6.編譯器的對齊選項

gcc編譯器對資料的對齊,提供很好支援。

6.1.使用#pragam pack

#pragam pack(n) 設定對齊

資料定義

#pragam pack() 恢復原來值

這種方式在vc也支援,從編譯器風格上看,應該是gcc相容vc。設定的n表示的是最大對齊maximum alignment,當比自然對齊的時候,就採用最大對齊;所以,預設情況下最大對齊和最大自然對齊是一致的。

3.2.編譯選項

使用gcc提供的編譯開關:-fpack-struct[=

]3.3.使用__attribute__

主要包含兩個算下:pack/aligned;

packed主要是用在結構體的定義上,使用packed後,結構體成員間將不會加入padding;

attribute提高對齊,比如可以定義16個自動的int變數

int x__attribute__ (aligned(16))=0;

aligend與pack聯合使用,這樣在結構體的最後加入padding。比如:

typedef sturct tagfoo

char a;double b;int c;char d;

} __arribute__((aligned(8),packed))foo;

這個結構體大小是16位元組,在最後增加了2個padding。

再談位元組對齊

再談位元組對齊 2009 05 01 21 32 請牢記以下3條原則 在沒有 pragma pack巨集的情況下 資料成員對齊規則 結構 struct 或聯合 union 的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始 比如int在 位...

記憶體對齊 記憶體對齊規則解釋 記憶體對齊原理

一 記憶體對齊的原因 我們都知道計算機是以位元組 byte 為單位劃分的,理論上來說cpu是可以訪問任一編號的位元組資料的,我們又知道cpu的定址其實是通過位址匯流排來訪問記憶體的,cpu又分為32位和64位,在32位的cpu一次可以處理4個位元組 byte 的資料,那麼cpu實際定址的步長就是4個...

記憶體對齊(自然對齊)

參考 今天與超,暉,棟,宇幾人論此問題,終得以下結論,不知正確與否,姑且記下。對於32位機,cpu的記憶體讀寫週期是4word,所以在記憶體對齊時,皆以此填滿。如 struct a char a double b char c sizeof a 4 8 4 16 struct b char a do...