2016年2月11日 星期四

__attribute__ 機制


__attribute__ 機制

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


__attribute__ 書寫特徵:__attribute__ 前後都有兩個底線,後面會緊跟一對原括弧,括弧裡面是相應的__attribute__ 參數。


__attribute__ 語法格式為:__attribute__ ((attribute-list))
其位置約束為:放於宣告尾部的分號“ ;” 之前。

關鍵字__attribute__ 也可以對結構體(struct )或共用體(union )進行屬性設置。大致有六個參數值可以被設定,即:

aligned, 
packed, 
transparent_union, 
unused, 
deprecated 和 
may_alias 。

在使用__attribute__ 參數時,你也可以在參數的前後都加上“__” (兩個底線),例如,使用__aligned__而不是aligned ,這樣,你就可以在相應的標頭檔裡使用它而不用關心標頭檔裡是否有重名的巨集定義。
 


aligned (alignment)
該屬性設定一個指定大小的對齊格式(以位元組 為單位),例如:
struct S {
short b[3];
} __attribute__ ((aligned (8)));
typedef int int32_t __attribute__ ((aligned (8)));
 

該聲明將強制編譯器確保(盡它所能)變數類 型為struct S 或者int32_t 的變數在分配空間時採用8 位元組對齊方式。
如上所述,你可以手動指定對齊的格式,同 樣,你也可以使用預設的對齊方式。如果aligned 後面不緊跟一個指定的數字值,那麼編譯器將依據你的目的機器情況使用最大最有益的對齊方式。例如:
struct S {
short b[3];
} __attribute__ ((aligned));
 

這裡,如果sizeof (short )的大小為2 (byte ),那麼,S 的大小就為6 。取一個2 的次方值,使得該值大於等於6 ,則該值為8 ,所以編譯器將設置S 類型的對齊方式為8 位元組。aligned 屬性使被設置的物件佔用更多的空間,相反的,使用packed 可以減小物件佔用的空間。需要注意的是,attribute 屬性的效力與你的連接器也有關,如果你的連接器最大只支援16 位元組對齊,那麼你此時定義32 位元組對齊也是無濟於事的。
 


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

下面的例子中,packed_struct 類型的變數陣列中的值將會緊緊的靠在一起,但內部的成員變數s 不會被“pack” ,如果希望內部的成員變數也被packed 的話,unpacked-struct 也需要使用packed 進行相應的約束。
struct unpacked_struct
{
      char c;
      int i;
};
       
struct packed_struct
{
     char c;
     int  i;
     struct unpacked_struct s;
}__attribute__ ((__packed__));

沒有留言:

張貼留言