Thinker 說
一個 C binary compatibility 的問題.
struct { uint32_t a; struct { uint32_t b; }}; 和 struct { uint32_t a; struct {uint32_t b; uint64_t c; }} 兩個 struct,後者是前者的擴充版本,多加了一個 c。但因為 c 欄位是 uint64_t,會使得內層的 struct 的 alignment 也變成 64 bits。這使得 b 欄位相對於整個 struct 的位置,往後移動了 4 bytes,以滿足 64bits alignment。於是兩個版本無法相容,不能把後者產生的資料給使用前者的 code 使用。或者說,無法讓新版的 code,發覺傳進來的 data 比較短,就簡單的跳過 c 不讀
struct { uint32_t a; struct { uint32_t b; }}; 和 struct { uint32_t a; struct {uint32_t b; uint64_t c; }} 兩個 struct,後者是前者的擴充版本,多加了一個 c。但因為 c 欄位是 uint64_t,會使得內層的 struct 的 alignment 也變成 64 bits。這使得 b 欄位相對於整個 struct 的位置,往後移動了 4 bytes,以滿足 64bits alignment。於是兩個版本無法相容,不能把後者產生的資料給使用前者的 code 使用。或者說,無法讓新版的 code,發覺傳進來的 data 比較短,就簡單的跳過 c 不讀