為什麼要用 “ __attribute__ ((__packed__)) ” 定義結構體
阿新 • • 發佈:2019-01-25
首先,解釋下 “__attribute__ ((__packed__))” 是做什麼的?
我們知道,通常定義一個U32 ,CPU 期望 這個 U32 地址是 DW 對齊的, 這樣對CPU訪問 mem bus 比較友好。
所以,當我們定義這樣一個結構體:
struct test{
char i,
uint32 a
}
那麼,編譯器會預設在 i 和 a 之間插入 reserve,確保 a 的位置是 4 對齊的。sizeof(test) = 8.
它就等效於:
struct test{ char i, char reserve[3], uint32 a }
加入 “__attribute__ ((__packed__))” 的效果,則在於避免編譯器 “自作聰明”。 告訴編譯器,我們這裡不需要補全。
struct __attribute__ ((__packed__)) test{
char i,
uint32 a
}
sizeof(test) = 5; 這會造成 a 地址不對齊,反而引入麻煩。
那為什麼要有這個東西呢? 如下截圖,是SPDK裡面關於 SGL 的定義。 我想這個最大的好處就是:
嚴格按照(NVMe) SPEC 定義資料結構,避免編譯器優化。
也就是說,static 型別的,系統優化會造成 通訊或者使用錯誤的,就要加這個型別。如果只是 軟體自用的變數,那最好就不用加了 ,避免出現 不對齊的地址,導致效能降低