欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4217|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

__attribute__((packed))詳解

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:104126 發(fā)表于 2016-1-23 00:31 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
1. __attribute__ ((packed))的作用就是告訴編譯器取消結(jié)構(gòu)在編譯過(guò)程中的優(yōu)化對(duì)齊,按照實(shí)際占用字節(jié)數(shù)進(jìn)行對(duì)齊,是GCC特有的語(yǔ)法。這個(gè)功能是跟操作系統(tǒng)沒(méi)關(guān)系,跟編譯器有關(guān),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__關(guān)鍵字主要是用來(lái)在函數(shù)或數(shù)據(jù)聲明中設(shè)置其屬性。給函數(shù)賦給屬性的主要目的在于讓編譯器進(jìn)行優(yōu)化。函數(shù)聲明中的__attribute__((noreturn)),就是告訴編譯器這個(gè)函數(shù)不會(huì)返回給調(diào)用者,以便編譯器在優(yōu)化時(shí)去掉不必要的函數(shù)返回代碼。
GNU C的一大特色就是__attribute__機(jī)制。__attribute__可以設(shè)置函數(shù)屬性(FunctionAttribute)、變量屬性(Variable Attribute)和類型屬性(Type Attribute)。

__attribute__書寫特征是:__attribute__前后都有兩個(gè)下劃線,并且后面會(huì)緊跟一對(duì)括弧,括弧里面是相應(yīng)的__attribute__參數(shù)。

__attribute__語(yǔ)法格式為:

__attribute__ ((attribute-list))

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

函數(shù)屬性(Function Attribute):函數(shù)屬性可以幫助開(kāi)發(fā)者把一些特性添加到函數(shù)聲明中,從而可以使編譯器在錯(cuò)誤檢查方面的功能更強(qiáng)大。__attribute__機(jī)制也很容易同非GNU應(yīng)用程序做到兼容之功效。

GNU CC需要使用–Wall編譯器來(lái)?yè)艋钤摴δ埽@是控制警告信息的一個(gè)很好的方式。

packed屬性:使用該屬性可以使得變量或者結(jié)構(gòu)體成員使用最小的對(duì)齊方式,即對(duì)變量是一字節(jié)對(duì)齊,對(duì)域(field)是位對(duì)齊。
如果你看過(guò)GPSR協(xié)議在TinyOS中的實(shí)現(xiàn),你一定會(huì)注意到下面的語(yǔ)句:
typedef struct {
   double x;
   double y;
} __attribute__((packed)) position_t;

開(kāi)始我們還可以理解,不久是定義一個(gè)結(jié)構(gòu)體嘛!不過(guò)看到后面的語(yǔ)句,你可能就會(huì)一頭霧水了,’__attribute__((packed))’是什么東西?有什么作用?一連串的疑問(wèn)馬上就會(huì)從你腦袋里冒出來(lái)。雖然這個(gè)對(duì)理解整個(gè)程序沒(méi)有什么影響,但我不想讓這些疑問(wèn)一直呆在我的腦子里,負(fù)擔(dān)太重。省得以后念念不忘,而且也許有一天可以用的上呢。搞清楚這個(gè)問(wèn)題吧!
GNUC的一大特色(卻不被初學(xué)者所知)就是__attribute__機(jī)制。__attribute__可以設(shè)置函數(shù)屬性(FunctionAttribute)、變量屬性(VariableAttribute)和類型屬性(TypeAttribute)。
__attribute__語(yǔ)法格式為:
__attribute__ ((attribute-list))
其位置約束為:放于聲明的尾部“;”之前。
packed是類型屬性(TypeAttribute)的一個(gè)參數(shù),使用packed可以減小對(duì)象占用的空間。需要注意的是,attribute屬性的效力與你的連接器也有關(guān),如果你的連接器最大只支持16字節(jié)對(duì)齊,那么你此時(shí)定義32字節(jié)對(duì)齊也是無(wú)濟(jì)于事的。
使用該屬性對(duì)struct或者union類型進(jìn)行定義,設(shè)定其類型的每一個(gè)變量的內(nèi)存約束。當(dāng)用在enum類型定義時(shí),暗示了應(yīng)該使用最小完整的類型(itindicates that the smallest integral type should beused)。
下面的例子中,my-packed-struct類型的變量數(shù)組中的值會(huì)緊湊在一起,但內(nèi)部的成員變量s不會(huì)被“pack”,如果希望內(nèi)部的成員變量也被packed的話,my-unpacked-struct也需要使用packed進(jìn)行相應(yīng)的約束。
struct my_unpacked_struct
{
    char c;
    int i;
};
         
struct my_packed_struct
{
    char c;
    int i;
    struct my_unpacked_struct s;
}__attribute__ ((__packed__));


在每個(gè)系統(tǒng)上看下這個(gè)結(jié)構(gòu)體的長(zhǎng)度吧。
   內(nèi)存對(duì)齊,往往是由編譯器來(lái)做的,如果你使用的是gcc,可以在定義變量時(shí),添加__attribute__,來(lái)決定是否使用內(nèi)存對(duì)齊,或是內(nèi)存對(duì)齊到幾個(gè)字節(jié),以上面的結(jié)構(gòu)體為例:

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

2)不對(duì)齊,結(jié)構(gòu)體的長(zhǎng)度,就是各個(gè)變量長(zhǎng)度的和
struct student
{
    charname[7];
    uint32_tid;
    charsubject[5];
} __attribute__ ((packed));

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

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表