1. 程式人生 > >cc++裏struct字節對齊規則

cc++裏struct字節對齊規則

inf mage style csdn博客 tps get lan 字節對齊 img

  規則一.: 每個成員變量在其結構體內的偏移量都是成員變量類型的大小的倍數。

  規則二: 如果有嵌套結構體,那麽內嵌結構體的第一個成員變量在外結構體中的偏移量,是內嵌結構體中那個數據類型大小最大的成員變量的倍數。

  規則三: 整個結構體的大小要是這個結構體內數據類型大小最大的成員變量的倍數。如果有內嵌結構體,那麽取內嵌結構體中數據類型大小最大的成員變量作為計算外結構體整體大小的依據。

例子

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

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