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

大多數計算機體系結構中,對內存操作時按整字存取才能達到最高效率,相當於是以空間換取時間,看似浪費了內存空間,但換來了存取效率,先來說說三個概念:系統對齊值,自身對齊值,有效對齊值,三個概念的單位均爲字節,一開始概念不懂沒關係,可以對照後面的程序和內存分佈圖來理解
1,  系統對齊值:
對於不同的操作系統,不同的開發環境,其默認的系統對齊值不同(通常是4或者8),在C語言裏你也可以通過一個宏{ #pragma pack(n) }來自定義系統對齊值爲n。
2,自身對齊值:
在結構體中,自身對齊值是指結構成員的類型所佔字節數,例如: int a;  那麼結構成員a的自身對齊值爲4。
3,有效對齊值:
若系統對齊值>自身對齊值,則有效對齊值=自身對齊值。
若自身對齊值>系統對齊值,則有效對齊值=系統對齊值。

ok! 現在上圖上代碼

假設結構體首地址爲0x00,在內存中,每一個成員要從離上一個成員最近,且能整除其有效對齊值的地址開始放置,放置大小爲其類型所佔字節數
結構體成員對齊
對於a,其有效對齊值爲1,從0x00處放置1個字節
對於b,其有效對齊值爲2,從0x02處放置4個字節
對於c,其有效對齊值爲2,從0x06處放置2個字節

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

 

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

假設結構體首地址爲0x00,在內存中,每一個成員要從離上一個成員最近,且能整除其有效對齊值的地址開始放置,放置大小爲其類型所佔字節數

結構體成員對齊

對於a,其有效對齊值爲1,從0x00處放置1個字節
對於b,其有效對齊值爲4,從0x04處放置4個字節
對於c,其有效對齊值爲2,從0x08處放置2個字節

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章