日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

_attribute_((packed))

發布時間:2023/12/9 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 _attribute_((packed)) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

From: http://blog.csdn.net/wesleyluo/article/details/7565165

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

如果你看過GPSR協議在TinyOS中的實現,你一定會注意到下面的語句:
typedef struct {
??? double x;
??? double y;
} __attribute__((packed)) position_t;

開始我們還可以理解,不久是定義一個結構體嘛!不過看到后面的語句,你可能就會一頭霧水了,’ __attribute__((packed))’是什么東西?有什么作用?一連串的疑問馬上就會從你腦袋里冒出來。雖然這個對理解整個程序沒有什么影響,但我不想讓這些疑問一直呆在我的腦子里,負擔太重。省得以后念念不忘,而且也許有一天可以用的上呢。搞清楚這個問題吧!

GNU C的一大特色(卻不被初學者所知)就是__attribute__機制。__attribute__可以設置函數屬性(Function Attribute)、變量屬性(Variable Attribute)和類型屬性(Type Attribute)。
__attribute__語法格式為:
__attribute__ ((attribute-list))

其位置約束為:放于聲明的尾部“;”之前。

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

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

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


__attribute__機制的詳細介紹請參考:

http://www.unixwiz.net/techtips/gnu-c-attributes.html

為了您的安全,請只打開來源可靠的網址

總結

以上是生活随笔為你收集整理的_attribute_((packed))的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。