久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4217|回復: 0
打印 上一主題 下一主題
收起左側

__attribute__((packed))詳解

[復制鏈接]
跳轉到指定樓層
樓主
ID:104126 發表于 2016-1-23 00:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
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; inta;}__attrubte__ ((packed))sizeof(int)=4;sizeof(my)=5
2.__attribute__關鍵字主要是用來在函數或數據聲明中設置其屬性。給函數賦給屬性的主要目的在于讓編譯器進行優化。函數聲明中的__attribute__((noreturn)),就是告訴編譯器這個函數不會返回給調用者,以便編譯器在優化時去掉不必要的函數返回代碼。
GNU C的一大特色就是__attribute__機制。__attribute__可以設置函數屬性(FunctionAttribute)、變量屬性(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))’是什么東西?有什么作用?一連串的疑問馬上就會從你腦袋里冒出來。雖然這個對理解整個程序沒有什么影響,但我不想讓這些疑問一直呆在我的腦子里,負擔太重。省得以后念念不忘,而且也許有一天可以用的上呢。搞清楚這個問題吧!
GNUC的一大特色(卻不被初學者所知)就是__attribute__機制。__attribute__可以設置函數屬性(FunctionAttribute)、變量屬性(VariableAttribute)和類型屬性(TypeAttribute)。
__attribute__語法格式為:
__attribute__ ((attribute-list))
其位置約束為:放于聲明的尾部“;”之前。
packed是類型屬性(TypeAttribute)的一個參數,使用packed可以減小對象占用的空間。需要注意的是,attribute屬性的效力與你的連接器也有關,如果你的連接器最大只支持16字節對齊,那么你此時定義32字節對齊也是無濟于事的。
使用該屬性對struct或者union類型進行定義,設定其類型的每一個變量的內存約束。當用在enum類型定義時,暗示了應該使用最小完整的類型(itindicates that the smallest integral type should beused)。
下面的例子中,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__));


在每個系統上看下這個結構體的長度吧。
   內存對齊,往往是由編譯器來做的,如果你使用的是gcc,可以在定義變量時,添加__attribute__,來決定是否使用內存對齊,或是內存對齊到幾個字節,以上面的結構體為例:

1)到4字節,同樣可指定對齊到8字節。
struct student
{
    charname[7];
    uint32_tid;
    charsubject[5];
} __attribute__((aligned(4)));

2)不對齊,結構體的長度,就是各個變量長度的和
struct student
{
    charname[7];
    uint32_tid;
    charsubject[5];
} __attribute__ ((packed));

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区在线看 | 久草视频在线播放 | 国产一区二区三区四区区 | 日韩久久久久久 | 一区二区三区av | 成人亚洲视频 | 一区二区三区四区视频 | 天堂在线1 | 欧美二区三区 | 色视频网站 | 91久久精品国产91久久 | 欧美日韩高清一区 | 成人性视频在线播放 | 亚洲一区 中文字幕 | 欧美一区二区在线 | 亚洲精品1区 | 国产成在线观看免费视频 | 精品在线一区二区 | 精品国产乱码久久久久久88av | 亚洲 欧美 在线 一区 | 亚洲视频一区在线 | 日韩精品成人一区二区三区视频 | 国产精品一区二区无线 | 欧美一级黄色片免费观看 | 一区二区三区欧美 | 亚洲精品久 | 日韩精品一区二区三区 | 91精品国产色综合久久 | 日韩视频专区 | 日韩激情网 | 国户精品久久久久久久久久久不卡 | 成人免费在线观看 | 国产精品免费观看 | 国产一级网站 | 91精品久久久久 | 日韩精品二区 | 国产激情偷乱视频一区二区三区 | 亚洲性在线 | 成人教育av | 一级国产精品一级国产精品片 | 欧美一区2区三区4区公司二百 |