關於結構體的成員對齊與結構體整體對齊

2021-08-25 17:00:01 字數 1528 閱讀 9812

大多數計算機體系結構中,對記憶體操作時按整字訪問才能達到最高效率,相當於是以空間換取時間,看似浪費了記憶體空間,但換來了訪問效率,先來說說三個概念:系統對齊值,自身對齊值,有效對齊值,三個概念的單位均為位元組,一開始概念不懂沒關係,可以對照後面的程式和記憶體分布圖來理解

1,  系統對齊值:

對於不同的作業系統,不同的開發環境,其預設的系統對齊值不同(通常是4或者8),在c語言裡你也可以通過乙個巨集來自定義系統對齊值為n。

2,自身對齊值:

在結構體中,自身對齊值是指結構成員的型別所佔位元組數,例如: int a;  那麼結構成員a的自身對齊值為4。

3,有效對齊值:

若系統對齊值》自身對齊值,則有效對齊值=自身對齊值。

若自身對齊值》系統對齊值,則有效對齊值=系統對齊值。

ok! 現在上圖上**

有效對齊值的位址開始放置,放置大小為其型別所佔位元組數

結構體成員對齊

對於a,其有效對齊值為1,從0x00處放置1個位元組

對於b,其有效對齊值為2,從0x02處放置4個位元組

對於c,其有效對齊值為2,從0x06處放置2個位元組

結構體整體對齊

經過上面結構體成員對齊後,記憶體中一共放置了8個位元組,對於此時整個結構體來說,其自身對齊值=8,系統對齊值=2,那麼其有效對齊值為2,有效對齊值能被自身對齊值整除,則不需要再補加記憶體位元組填充,故最終結構體記憶體大小為8位元組。

我們再來看看當系統對齊值為4的情況

結構體成員對齊

對於a,其有效對齊值為1,從0x00處放置1個位元組

對於b,其有效對齊值為4,從0x04處放置4個位元組

對於c,其有效對齊值為2,從0x08處放置2個位元組

結構體整體對齊

與圖一不同,此時記憶體中一共放置了10個位元組,對於此時整個結構體來說,其自身對齊值=10,系統對齊值=4,那麼其有效對齊值為4,有效對齊值不能被自身對齊值整除,則需要再補加記憶體位元組填充至剛好能整除(此處填充2位元組),故最終結構體記憶體大小為12位元組。

---------------------------------------增改------------------------------------------

描述:當自定義系統對齊值為8時,上述結構體大小仍為12,說明對於上述結構體,系統對齊值不全是由#pragma pack()決定,而是由#pragma pack()和結構體中最大位元組型別共同決定,當結構體中最大位元組型別

結構體成員對齊的問題

現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。1 現象 比如有些平台每次讀都是從偶位址開始...

結構體中的成員對齊

關於結構體中成員對齊的總結 a.結構體中,結構體成員要對齊到其對齊值倍數的位址上,對齊值為min 成員型別對齊值,編譯器結構成員對齊值b.結構體本身的對齊值為其所有成員中最大的對齊值。c.結構體本身要對齊到其對齊值倍數的位址上。d.結構體中的結構體要對齊到其對齊值倍數的位址上。e.結構體成員在記憶體...

結構體成員的記憶體對齊

include void printf arr quint8 data,int len,quint8 base num if 16 base num printf n struct frame big struct frame small struct frame union union int m...