1, 在結構中各成員按其宣告順序在記憶體中順序儲存, 第乙個成員的位址即結構的位址.
2, 在預設情況下, 結構的資料成員按其自身寬度自然對齊, 使得每個field的offset為該成員寬度的整數倍, 不足則前面補齊.
3, 整個結構的寬度是最大對齊量的整數倍, 不足則在後面補齊.
4, 更改gcc編譯器的預設位元組對齊方式有四,
a, __attribute__ ((packed)), 取消結構在編譯過程中的優化對齊, 按照實際占用位元組數進行對齊.
b,使用偽指令#pragma pack (n), c編譯器將按照n個位元組對齊. 另使用偽指令#pragma pack (), 取消自定義位元組對齊方式.
- 當n大於成員寬度的時候, 成員按照自身寬度對齊.
- 當n小於成員寬度的時候, 成員按照n對齊.
- 當n大於最大成員寬度時, 整個結構按照最大成員寬度對齊, 即結構寬度為最大成員寬度的倍數. 不足則在結構最後補齊.
- 當n小於最大成員寬度時, 整個結構按照n對齊, 即結構寬度為n的倍數.
c,__attribute((aligned (n))), 用在結構末尾, 讓整個結構對齊在n位元組自然邊界上. 成員總是按照自身寬度對齊.
- 當n小於最大成員寬度時, 整個結構按照最大成員寬度對齊.
- 當n大於最大成員寬度時, 整個結構按照n對齊.
d, __attribute((aligned (n)))用在結構當中的成員上, 表現與c同
- 當n大於成員寬度的時候, 成員按照n對齊.
- 當n小於成員寬度的時候, 成員按照自身寬度對齊.
5, 結構中的陣列按照單個元素的寬度對齊, 而不是按照整個陣列的寬度對齊.
結構體位元組對齊小結
1.位元組對齊的原因 一些平台對某些特定型別的資料,只能從特定位址開始訪問。如有些訪問是從偶位址開始,假設int 32位 的資料存在偶位址開始,則只需要乙個週期就能拿到。但如果在奇位址開始,則除了要用2個週期讀取外,還要對高低位址進行拼湊才能得到正確的資料。顯然這是低效的。2.一般編譯器在編譯程式時...
gcc 記憶體對齊
cpu以位元組為單位編址,而c語言指標以指向的資料型別長度作自增和自減。gcc下的double的alignment requirement 在用編譯選項 malign double的時候,double的alignment requirement是雙字 32位機器上就是8 用 mno align do...
gcc資料結構對齊之 why
gcc 支援 aligned 和 packed 屬性指定資料對齊,那麼在了解對齊規則之前,需要解決第乙個以為,我們為什麼需要資料對齊?請看下圖 相信學過彙編的朋友都很熟悉這張圖,這張圖就是cpu與記憶體如何進行資料交換的模型,其中,左邊藍色的方框是cpu,右邊綠色的方框是記憶體,記憶體上面的0 3是...