一、原則:
1.結構體内成員按自身按自身長度自對齊。
自身長度,如char=1,short=2,int=4,double=8,。所謂自對齊,指的是該成員的起始位置的記憶體位址必須是它自身長度的整數倍。如int隻能以0,4,8這類的位址開始
2.結構體的總大小為結構體的有效對齊值的整數倍
結構體的有效對齊值的确定:
1)當未明确指定時,以結構體中最長的成員的長度為其有效值
2)當用#pragma pack(n)指定時,以n和結構體中最長的成員的長度中較小者為其值。資料成員、結構體和類的有效對齊值:自身對齊值和指定對齊值中小的那個值。影響各成員偏移與總大小
3) attribute((aligned (n))),讓所作用的結構成員對齊在n位元組自然邊界上。如果結構中有成員的長度大于n,則按照最大成員的長度來對齊。告訴編譯器一個結構體或者類或者聯合或者一個類型的變量(對象)配置設定位址空間時的位址對齊方式。也就是所,如 果将attribute((aligned(m)))作用于一個類型,那麼該類型的變量在配置設定位址空間時,其存放的位址一定按照m位元組對齊(m必 須是2的幂次方)。并且其占用的空間,即大小,也是m的整數倍,以保證在申請連續存儲空間的時候,每一個元素的位址也是按照m位元組對齊。 影響整個結構的大小
attribute__ ((packed)),取消結構在編譯過程中的優化對齊,按照實際占用位元組數進行對齊。
二、正确處理位元組對齊
對于标準資料類型,它的位址隻要是它的長度的整數倍就行了,而非标準資料類型按下面的原則對齊:
數組 :按照基本資料類型對齊,第一個對齊了後面的自然也就對齊了。
聯合 :按其包含的長度最大的資料類型對齊。
結構體: 結構體中每個資料類型都要對齊。
ps:Vc,Vs等編譯器預設是#pragma pack(8),是以測試我們的規則會正常;注意gcc預設是#pragma pack(4),并且gcc隻支援1,2,4對齊。套用三原則裡計算的對齊值是不能大于#pragma pack指定的n值