結構體內存對齊

爲什麼要內存對齊?

1、某些硬件平臺只能在某些地址處取某些特定類型的數據,否則拋出硬件異常。
2、性能原因,爲了訪問未對齊的內存,處理器需要作兩次內存訪問;而對齊的內存訪問僅需要一次訪問。


對齊規則?

    每個特定平臺上的編譯器都有自己的默認“對齊係數”(GCC默認爲4, GCC 64位機器默認爲8)。

    基本規則:

    1、數據成員對齊規則:結構(struct)(或聯合(union))的數據成員,第一個數據成員放在offset爲0的地方,以後每個數據成員的對齊按照#pragma pack指定的數值和這個數據成員自身長度中,比較小的那個進行。

    2、結構(或聯合)的整體對齊規則:在數據成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大數據成員長度中,比較小的那個進行。


如何指定對齊係數?

    1. #pragma pack(N) //N必須爲2的N次方
        #pragma pack()  //恢復默認的基準;
    2.
      struct example_t
      {
      //...
      } __attribute__((packed或aligned(N))); // packed表示緊湊模式,相當於#pragma pack(1)
    3. gcc -fpack-struct=N ...

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