__attribute__((packed)) 詳解

Craftor發表於2014-06-27

摘自LDD3

為了編寫可以在不同平臺之間可移植的資料項的資料結構,除了規定特定的位元組序以外,還應該始終強制資料項的自然對齊。
自然對齊(Natural Alignment)是指在資料項大小的整數倍(例如,8位元組資料項存入8的整數倍的地址)的地址處儲存資料項。
強制自然對齊可以防止編譯器移動資料結構的欄位,你應該使用填充符(filer)欄位來避免在資料結構中留下空洞。

編譯器本身可能會往結構體中插入填充資料,以確保每個欄位的對齊可以在目標處理器上取得好的效能。
如果正在定義一個和裝置要求的結構體相匹配的結構體,這種自動填充會破壞你的意圖。解決的辦法是告訴編譯器結構體必須是“填滿的”,不能新增填充符。
就是在結構體宣告的地方加上__attribute__((packed)),例如:

struct { 
    u16 id; 
    u64 lun; 
    u16 reserved1; 
    u32 reserved2; 
} __attribute__ ((packed)) scsi;

如果沒有__attribute__((packed)),lun欄位前面會被插入兩個填充位元組,按4位元組對齊。