結構體的記憶體對齊

2021-08-05 18:36:20 字數 813 閱讀 9260

資料項只能儲存在位址是資料項大小的整數倍的記憶體位置上

例如int型別占用4個位元組,位址只能在0,4,8等位置上。

記憶體對齊係數:

每個作業系統都有自己的預設記憶體對齊係數,如果是新版本的作業系統,預設對齊係數一般都是8,(例如int是4,char是1,long在32位編譯時是4,64位編譯時是 8)。當作業系統的預設對齊係數與記憶體對齊的理論產生衝突時,以作業系統的對齊係數為基準。

記憶體對齊產生的原因:

記憶體對齊是作業系統為了快速訪問記憶體而採取的一種策略,簡單來說,就是為了放置變數的二次訪問。作業系統在訪問記憶體 時,每次讀取一定的長度(這個長度就是作業系統的預設對齊係數,或者是預設對齊係數的整數倍)。如果沒有記憶體對齊時,為了讀取乙個變數是,會產生匯流排的二 次訪問。

例如假設沒有記憶體對齊(預設對齊係數為8),結構體xx的變數位置會出現如下情況:

struct xx{

char b;         //0xffbff5e8

int a;            //0xffbff5e9       

int c;             //0xffbff5ed      

char d;         //0xffbff5f1

作業系統先讀取0xffbff5e8-0xffbff5ef的記憶體,然後在讀取0xffbff5f0-0xffbff5f8的記憶體,為了獲得值c,就需要將兩組記憶體合併,進行整合,這樣嚴重降低了記憶體的訪問效率。(這就涉及到了老生常談的問題,空間和效率哪個更重要?)。

這樣大家就能理解為什麼結構體的第乙個變數,不管型別如何,都是能被8整除的吧(因為訪問記憶體是從8的整數倍開始的,為了增加讀取的效率)!

結構體對齊(記憶體對齊

有的時候,在腦海中停頓了很久的 顯而易見 的東西,其實根本上就是錯誤的。就拿下面的問題來看 structt 使用sizeof t 將得到什麼樣的答案呢?要是以前,想都不用想,在32位機中,int是4個位元組,char是1個位元組,所以t一共是5個位元組。實踐出真知,在vc6中測試了下,答案確實8個位...

記憶體對齊 結構體對齊

現在已知32位機器上各種資料型別的長度如下 char 1 有符號無符號同 short 2 有符號無符號同 int 4 有符號無符號同 long 4 有符號無符號同 float 4 double 8 重要規則 1,複雜型別中各個成員按照它們被宣告的順序在記憶體中順序儲存,第乙個成員的位址和整個型別的位...

結構體的記憶體對齊

原則一 結構體中元素是按照定義順序乙個乙個放到記憶體中去的,但並不是緊密排列的。從結構體儲存的首位址開始,每乙個元素放置到記憶體中時,它都會認為記憶體是以它自己的大小來劃分的,因此元素放置的位置一定會在自己寬度的整數倍上開始 以結構體變數首位址為0計算 原則二 在經過第一原則分析後,檢查計算出的儲存...