回覆列表
  • 1 # 使用者4685764123666

    一般的實現上結構體佈局是這樣(暫不計位域和柔性陣列):

    首個成員偏移是 0 (標準要求)。

    後一個成員需要在前一個成員之後(標準要求)。其偏移是保證該成員不與前一成員重疊的該成員對齊的最小整數倍。

    結構體的對齊是各個成員對齊的最大值。結構體的大小是能保證放下最後成員的對齊的最小整數倍。

    標準允許結構體有更大對齊或佈局更加“鬆垮”一點(有更多空隙),但實現一般不會這樣。

    一般實現上陣列型別的對齊同元素型別。

    這裡的規則無論成員和元素是否為結構體都成立。

    按題主描述,測試所用的平臺使用 LP64 資料模型,short 大小與對齊均為 2 位元組, int 大小與對齊均為 4 位元組, long 及指標大小與對齊均為 8 位元組。

    struct P1 { int a; char b; int c; char d; };

    a 偏移為 0 , b 偏移為 4 , c 偏移為 8 (大於 4 + 1 的 4 的最小整數倍), d 偏移為 12 。 P1 對齊為 4 ,大小為 16 。

    struct P2 { int a; char b; char c; long d; };

    a 偏移為 0 , b 偏移為 4 , c 偏移為 5 , d 偏移為 8 。 P2 對齊為 8 , 大小為 16 。

    struct P3 { short a[3]; char b[3]; };

    a 偏移為 0 , b 偏移為 6 。 P3 對齊為 2 ,大小為 10 。

    struct P4 { short a[3]; char *b[3]; };

    a 偏移為 0 , b 偏移為 8 (大於 0 + 6 的 8 的最小整數倍)。 P4 對齊為 8 ,大小為 32 。

    struct P5 { struct P3 a[2];struct P2 t;};

    a 偏移為 0 , t 偏移為 24 (大於 0 + 20 的 8 的最小整數倍)。 P5 對齊為 8 ,大小為 40 。

    C 中型別大小可用 sizeof 獲取,型別對齊可用 _Alignof 獲取,成員偏移可用宏 offsetof 獲取。

  • 中秋節和大豐收的關聯?
  • 如果你有一次後悔的機會,你最想後悔的事情是什麼?