首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言結構體嵌套時的字節對齊規則詳解與實測驗證

     編輯:關於C語言

背景

網上常見觀點認為嵌套結構體應作為整體按其大小對齊,但實測(GCC、VS2010)證明該觀點錯誤。本文通過多組實例給出正確規則。

實例 1:嵌套純 char 結構體

struct s1 { char c[4]; };          // sizeof = 4
struct s2 { char a; struct s1 s; } // sizeof = 5 (非 8)

內存佈局:s2: a | s.c[0] s.c[1] s.c[2] s.c[3]
s 起始地址只需滿足 char 對齊(1 字節),而非 4 字節。

實例 2:嵌套含 short 結構體

struct S1 { char c; short s; };    // sizeof = 4 (對齊後)
struct S2 { char a; struct S1 s; } // sizeof = 6

S2 佈局:a | padding(1) | s.c | s.s
s 起始地址按其內部最寬類型 short (2 字節) 對齊,整體大小也按 2 字節對齊。

實例 3:對比無嵌套結構

struct S { char c; char d; short s; } // sizeof = 4

手動展開後編譯器可優化填充,嵌套時保持內部佈局不變,導致外層可能增加填充。

總結規則

  1. 嵌套結構體成員按其**原有內存佈局**在外層結構中鋪排。
  2. 嵌套成員起始地址按其**內部最長基本類型**大小對齊(非整體大小)。
  3. 外層結構體總大小按**所有基本類型中最長者**對齊(與嵌套結構體整體大小無關)。

硬件視角解讀

CPU 讀取內存以字長(32 位為 4 字節)為單位。對齊旨在減少訪存次數。基本類型長度可控,強制整體對齊收益大;嵌套結構體長度不定,若強制整體對齊可能浪費大量空間且不減少訪存次數。故編譯器退而求其次,按內部最長類型對齊,平衡時空。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved