上篇文章中介紹了 __attribute__ mechanism Function Attribute 參考連結:http://www.cnblogs.com/respawn/archive/2012/07/09/2582548.html
我不喜歡對自己寫的文章做過多的修飾,所以很不注重排版,喜歡走簡約路線. 所以如果您認為我的博文排版很差而忽略文章內容的話,那麼我
只能說我注重技術,不注重次要的浪費時間的無價值動作. 如果您可以對我的博文進行批評指正的話,那我這裡謝過了.技術嘛,需要多討論,多
研究,不是寫出來給別人讚揚的.(上述僅代表我個人觀點,如果您不喜歡,請原諒.)
下午有事出去了,直到剛才才回宿舍洗完澡,現在聽著音樂,靜下心來繼續未完成的工作.
在之前的文章中,我給出了很多的執行個體操作. 在這篇文章中我就不再給出執行個體了,因為方法都已經很明確了.大家可以自己嘗試,若有一兩個的確需要給出執行個體
的,我會給出參考執行個體的.
一、 Variable Attribute
1. __attribute__((alias)) : 在之前的文章中有說過對於函數的限定,在這裡是對變數的限定,用法很相似:
type newname __attribute__((alias("oldname")));
其中的newname和oldname都不需要再解釋了,和前面的文章中說的一樣. 在使用的時候對於newname的操作,就是對oldname的操作.
2. __attribute__((aligned(ALIGNMENT))): 指定變數或結構體最小位元組對齊數,以byte為單位.
ALIGNMENT: 指定的位元組對齊運算元.
其他的就不多說了,因為關於位元組對齊這部分的內容如果需要說明白,可以單獨寫一篇博文了,考慮一下,有時間我回補充這一節,單獨寫一篇.
3.__attribute__((cleanup(cleanup_function)): 當一個變數的範圍消失時,便會執行後面的clean_function函數.
如何去理解這一點呢? 就好像是C++中的智能指標一樣,當離開它的範圍的時候就會被銷毀.通過使用 __attribute mechiansm cleanup屬性也可以做
到.
4.__attribute__((deprecated(MSG))): 註明這是一個被棄用的變數,前面說到的是棄用的函數.
MSG: 輸出的資訊.
如果被棄用的變數在其他的地方被使用了,那麼編譯器就會輸出warnning.但是編譯還是會通過. warnning的資訊中包括有棄用變數被使用的未知,通常是
指在某個檔案中某行這類的資訊.
使用方法和棄用函數的方法一樣.
5. __attribute__((section("section-name"))): 這個是我在前文中說過的.
6. __attribute__((packed)): 使變數或者是結構體按照最小的對齊,對於變數是1byte對齊,對於欄位,也就是field指bit對齊.
這個會放到後面和前面的aligned一起作為位元組對齊的討論內容.
7.__attribute__((weak)) : 這個很搞了,官網上的手冊只是丟了一個連結 那就是去參考Function Attribute中weak attribute的用法.所以我也就不多說什麼了.
二、Type Attribute
1.__attribute__((aligned(ALIGNMENT))) : 位元組對齊,和前面的用法差不多,注意使用aligned attribute使變數或者是結構做位元組對齊的時候,對齊後只會增大或者不變.
struct S { short f[3]; } __attribute__((aligned(8)));typedef int more_aligned_int __attribute__((aligned(8)));
如上面所示, struct S 指定了對齊的方式是8byte. f[3]總共是6byte.而由於指定了位元組對齊運算元是8,所以整個S結構體就是8byte.
2.__attribute__((packed)): 前面已經介紹過了 packed attribute. 和前面的aligned不同的是,packed採用的是緊湊型的位元組對齊,所以最後是會按照最小對齊執行.
struct unpacked_struct{ char c; int i;};struct __attribute__(( packed )) packed_struct{ char c; int i; struct unpacked_struct us;};
在上面的範例程式碼中,我們可以看到,在指定了packed對齊的struct packed_struct中有一個沒有指定對齊的struct unpacked_struct對象。
儘管我們對結構體packed_struct進行了packed方式的對齊,但是不能對其成員us進行指定位元組對齊. 這點是需要注意的,所以如果需要對packed_struct結構進行packed完全緊湊對齊,
則需要對unpacked_struct進行packed方式緊湊對齊.
OK,把上午剩下的任務補上了...