字節對齊

有效對齊值 = min(結構自身對齊值, 指定對齊值)。

1. 結構自身對齊值:

(1)基本數據類型:char --1, short -- 2, int --4;

(2) 結構體或類:所有成員自身對齊值中的最大值;

2. 指定對齊值

#pragma pack(value) ,另linux下還可用__attribute__() 來指定。

原因:在讓每個成員在一次內存訪問中被讀取或寫入。對於32位CPU,一次可以處理32位,也就是4個字節,

實際訪問內存,它從4的整數倍的內存地址,一個可以讀出4個字節,如地址在0、1、2、3的雙字可以一次次處理,而4、5、6、7則要到下一次。
如果不對齊的話,可能出現這樣的情況,一個字或是雙字恰好跨越了兩次訪問的內容,比如說它在1、2、3、4,那麼要取它的話,必然要訪問兩次內存。

這樣會造成效率的下降。

 

編譯器爲結構分配的地址要對齊在“有效對齊值”的邊界上,即若有效對齊值爲N,地址爲addr,則

addr % N == 0。

另外,結構體或類的大小有“圓整”要求,即sizof(struct X) % 有效對齊值 == 0。原因:考慮結構體數組,讓連續

排列的另外的結構體也滿足對齊要求。

在32位CPU上,gcc 和windows 默認是4字節對齊。

發佈了44 篇原創文章 · 獲贊 7 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章