參考: wiki Data_structure_alignment.
C 語言字節對齊問題詳解, 這篇文章寫的很詳細。
ARM 下的對齊處理
參考
1、stm32 中字節對齊問題 (__align(n), __packed 用法 )
2、stm32 中使用 #pragma pack(非常有用的字節對齊用法說明)
3、正點原子開源電子論壇_ mymalloc 函數沒有實現 4 字節對齊!
對齊的使用
01 align(num)
用於修改最高級別對象的字節邊界。在彙編中使用 LDRD 或者 STRD 時就要用到此命令 __align(8)
進行修飾限制。來保證數據對象是相應對齊。
修飾對象的命令最大是 8 個字節限制, 可以讓 2 字節的對象進行 4 字節對齊, 但是不能讓 4 字節的對象 2 字節對齊。
__align
是存儲類修改, 他只修飾最高級類型對象不能用於結構或者函數對象。
02 __packed
__packed
用於表示 C 語言中結構的壓縮,即:沒有填充和對齊。__packed
是進行一字節對齊。
- 不能對 packed 的對象進行對齊。
- 所有對象的讀寫訪問都進行非對齊訪問。
- float 及包含 float 的結構聯合及未用
__packed
的對象將不能字節對齊。 __packed
對局部整形變量無影響。- 強制由 unpacked 對象向 packed 對象轉化是未定義, 整形指針可以合法定義爲 packed。
__packed int* p; //__packed int 則沒有意義
- 對齊或非對齊讀寫訪問帶來問題。
已知 32 位機器上各數據類型的長度爲:char 爲 1 字節、short 爲 2 字節、int 爲 4 字節、long 爲 4 字節、float 爲 4 字節、double 爲 8 字節。那麼上面兩個結構體大小如何呢?
結果是:sizeof(strcut A) 值爲 8;sizeof(struct B) 的值卻是 12。
結構體 A 中包含一個 4 字節的 int 數據,一個 1 字節 char 數據和一個 2 字節 short 數據;B 也一樣。按理說 A 和 B 大小應該都是 7 字節。之所以出現上述結果,就是因爲編譯器要對數據成員在空間上進行對齊。