__attribute__((packed))

__attribute__((packed))

1. __attribute__ ((packed)) 的作用就是告訴編譯器取消結構在編譯過程中的優化對齊,按照實際佔用字節數進行對齊,是GCC特有的語法。

這個功能是跟操作系統沒關係,跟編譯器有關,gcc編譯器不是緊湊模式的,在windows下,用vc的編譯器也不是緊湊的,用tc的編譯器就是緊湊的。

例如:

在TC下:struct my{ char ch; int a;} sizeof(int)=2;sizeof(my)=3;(緊湊模式)

在GCC下:struct my{ char ch; int a;} sizeof(int)=4;sizeof(my)=8;(非緊湊模式)

在GCC下:struct my{ char ch; int a;}__attrubte__ ((packed)) sizeof(int)=4;sizeof(my)=5

2. __attribute__關鍵字主要是用來在函數或數據聲明中設置其屬性。給函數賦給屬性的主要目的在於讓編譯器進行優化。函數聲明中的__attribute__((noreturn)),就是告訴編譯器這個函數不會返回給調用者,以便編譯器在優化時去掉不必要的函數返回代碼。

GNU C的一大特色就是__attribute__機制。__attribute__可以設置函數屬性(Function Attribute)、變量屬性(Variable Attribute)和類型屬性(Type Attribute)。

__attribute__書寫特徵是:__attribute__前後都有兩個下劃線,並且後面會緊跟一對括弧,括弧裏面是相應的__attribute__參數。
__attribute__語法格式爲:
__attribute__ ((attribute-list))
其位置約束:放於聲明的尾部“;”之前。

函數屬性(Function Attribute):函數屬性可以幫助開發者把一些特性添加到函數聲明中,從而可以使編譯器在錯誤檢查方面的功能更強大。__attribute__機制也很容易同非GNU應用程序做到兼容之功效。

GNU CC需要使用 –Wall編譯器來擊活該功能,這是控制警告信息的一個很好的方式。


packed屬性:使用該屬性可以使得變量或者結構體成員使用最小的對齊方式,即對變量是一字節對齊,對域(field)是位對齊。

packed是類型屬性(Type Attribute)的一個參數,使用packed可以減小對象佔用的空間。需要注意的是,attribute屬性的效力與你的連接器也有關,如果你的連接器最大隻支持16字節對齊,那麼你此時定義32字節對齊也是無濟於事的。

使用該屬性對struct或者union類型進行定義,設定其類型的每一個變量的內存約束。當用在enum類型定義時,暗示了應該使用最小完整的類型(it indicates that the smallest integral type should be used)。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章