c\c++里struct字節對齊規則


#pragma pack(N)

  編譯器用'N'來設置數據的對齊方式。默認32位OS對齊字節是4,64位對齊字節是8。'N'有可能影響結構體內部成員的對齊位置,以及結構體整體大小。

對齊規則

   規則一.: 每個成員變量在其結構體內的偏移量都是“MIN(對齊字節,成員變量類型的大小)”的倍數。

    規則二: 如果有嵌套結構體,那么內嵌結構體的第一個成員變量在外結構體中的偏移量,是“MIN(對齊字節,內嵌結構體中那個數據類型大小最大的成員變量)”的倍數。

    規則三: 整個結構體的大小要是“MIN(對齊字節,這個結構體內數據類型大小最大的成員變量)”的倍數。如果有內嵌結構體,那么取“MIN(對齊字節,內嵌結構體中數據類型大小最大的成員變量)”作為計算外結構體整體大小的依據。

例子

環境:64位OS

typedef struct TEST{ int na; char cb; char cc; int nd; char cf; struct TT{ int ng; long long llh; }tt; char ci; }test;

 

                        圖一

  如上圖所示,根據規則一,nd在結構體內的位置必須滿足是其自身數據類型大小的整數倍,且倍數要取滿足條件的最小倍數。因為nd前三個成員變量總大小是6Bytes,nd作為int類型,其數據類型大小是4Bytes,滿足條件的最小倍數是2,所以nd在結構體中的偏移量是8,故填充2Bytes。

  根據規則二,ng作為內嵌結構體的第一個成員變量,它在外結構體中的偏移量要滿足——其內嵌結構體中最大數據類型大小的倍數。在計算cf偏移量后,當前偏移量是13,而內嵌結構體中最大數據類型為long long,其大小為8,ng的偏移量必須是8的倍數,且取大於13的最小倍數,即2。所以ng前要填充3Bytes。

  根據規則三,計算完ci后,當前偏移量是33。如果要滿足test結構體的大小是其中最大數據成員類型大小的倍數,在此例中是內嵌結構體的成員變量llh,即8的倍數。所以要填充7Bytes。

參考

CSDN博客:https://blog.csdn.net/zhanghow/article/details/55262988

字節對齊與結構體:https://blog.csdn.net/isco22/article/details/89632945


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM