有效對齊值 = 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字節對齊。