GNU C – Using GNU GCC __attribute__ mechanism 02 Variable Attribute && Type Attribute

來源:互聯網
上載者:User

上篇文章中介紹了 __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,把上午剩下的任務補上了...

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.