天天看點

關于C語言位元組對齊問題的解釋

對于位元組對齊問題一直有所疑惑,在網上搜尋資料也是看的迷迷糊糊。看了這位大神的分析,才真正結了我的困惑。

關于C語言位元組對齊問題的解釋

原文連結

https://mp.weixin.qq.com/s/WRaJQ8gD22OhLPvhM0dHew?

https://mp.weixin.qq.com/s/Lj7uTdgjYoA3ZbGyUJXI9w?

https://mp.weixin.qq.com/s/mFvBXRNrJBB-kdFtOyKutg?

總結

  1. 如果我們沒有給出特别的訓示,編譯器會傾向于:
  • 将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);
  1. Cortex-M0/M0+

    不支援非位元組對齊,

    Cortex-M3/M4/M7

    支援非位元組對齊。
  2. 可通過

    __packed

    直接告訴編譯器對目标資料的通路是非對齊的。
  3. 在ARM Compiler裡面,結構體的對齊使用以下規則:
  • 整個結構體,根據結構體内最大的那個元素來對齊。比如,整個結構體内部最大的元素是WORD,那麼整個結構體就預設對齊到4位元組。
  • 結構體内部,成員變量的排列順序嚴格按照定義的順序進行。
  • 結構體内部,成員變量自動對齊到自己的大小——這就會導緻空隙的産生。

繼續閱讀