__attribute__ ((packed)) 的做用

最近在看咱們的代碼的時候發現聲明類型的時候有 __attribute__ ((packed))的結構體類型聲明,不知道是什麼意思,查了下知道是以下含義: html

1. __attribute__ ((packed)) 的做用就是告訴編譯器取消結構在編譯過程當中的優化對齊,按照實際佔用字節數進行對齊,是GCC特有的語法。這個功能是跟操做系統不要緊,跟編譯器有關,gcc編譯器不是緊湊模式的,我在windows下,用vc的編譯器也不是緊湊的,用tc的編譯器就是緊湊的。例如: windows

在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 spa

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)是位對齊。 htm

http://blogguan.blog.sohu.com/109697765.html blog

/* __attribute__ ((packed)) 的位置約束是放於聲明的尾部「;」以前 */
struct str_struct{
        __u8    a;
        __u8    b;
        __u8    c;
        __u16   d;
} __attribute__ ((packed));

/* 當用到typedef時,要特別注意__attribute__ ((packed))放置的位置,至關於:
   * typedef struct str_stuct str;
   * 而struct str_struct 就是上面的那個結構。
*/
typedef struct {
        __u8    a;
        __u8    b;
        __u8    c;
        __u16   d;
} __attribute__ ((packed)) str; 開發

/* 在下面這個typedef結構中,__attribute__ ((packed))放在結構名str_temp以後,其做用是被忽略的,注意與結構str的區別。*/
typedef struct {
        __u8    a;
        __u8    b;
        __u8    c;
        __u16   d;
}str_temp __attribute__ ((packed)); get

相關文章
相關標籤/搜索