1. 程式人生 > >為什麼要用 “ __attribute__ ((__packed__)) ” 定義結構體

為什麼要用 “ __attribute__ ((__packed__)) ” 定義結構體

首先,解釋下 “__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 型別的,系統優化會造成 通訊或者使用錯誤的,就要加這個型別。如果只是 軟體自用的變數,那最好就不用加了 ,避免出現 不對齊的地址,導致效能降低

結構體定義