C 語言在 STM32 下字節對齊

參考: 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 字節。之所以出現上述結果,就是因爲編譯器要對數據成員在空間上進行對齊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章