對于位元組對齊問題一直有所疑惑,在網上搜尋資料也是看的迷迷糊糊。看了這位大神的分析,才真正結了我的困惑。
原文連結
https://mp.weixin.qq.com/s/WRaJQ8gD22OhLPvhM0dHew?
https://mp.weixin.qq.com/s/Lj7uTdgjYoA3ZbGyUJXI9w?
https://mp.weixin.qq.com/s/mFvBXRNrJBB-kdFtOyKutg?
總結
- 如果我們沒有給出特别的訓示,編譯器會傾向于:
- 将uint32_t(4個位元組)的變量放到被4整除的位址上,0x0、0x4、0x8、0xC…,也就是我們常說的對齊到字(Word Aligned);
- 将uint16_t(2個位元組)的變量放到能被2整除的位址上,0x0、0x2、0x4…也就是我們常說的對齊到半字(Half-word Aligned);
- 将uint64_t(8個位元組)的變量放到被8整除的位址上,0x0、0x8… 也就是我們常說的對齊到雙字(Double Word Aligned);
-
不支援非位元組對齊,Cortex-M0/M0+
支援非位元組對齊。Cortex-M3/M4/M7
- 可通過
直接告訴編譯器對目标資料的通路是非對齊的。__packed
- 在ARM Compiler裡面,結構體的對齊使用以下規則:
- 整個結構體,根據結構體内最大的那個元素來對齊。比如,整個結構體内部最大的元素是WORD,那麼整個結構體就預設對齊到4位元組。
- 結構體内部,成員變量的排列順序嚴格按照定義的順序進行。
- 結構體内部,成員變量自動對齊到自己的大小——這就會導緻空隙的産生。