arm編程中__packed的使用
今天在看代碼的時(shí)候看到以下代碼:
structdsi_ctrl_hdr{
chardtype;/*datatype*/
charlast;/*lastinchain*/
charvc;/*virtualchan*/
charack;/*askACKfromperipheral*/
charwait;/*ms*/
shortdlen;/*16bits*/
}__packed;
結(jié)構(gòu)體的末尾用__packed進(jìn)行限定。因?yàn)椴欢溆梅?,于是通過百度整理了__packed的作用及用法。
__packed 限定符將所有有效類型的對(duì)齊邊界設(shè)置為 1。這就意味著:
1、不會(huì)插入填充以對(duì)齊壓縮對(duì)象
2、使用未對(duì)齊的訪問讀取或?qū)懭雺嚎s類型的對(duì)象。
使用 __packed 限定符聲明結(jié)構(gòu)或聯(lián)合后,__packed 將應(yīng)用于該結(jié)構(gòu)或聯(lián)合的所有成員。成員之間或結(jié)構(gòu)末尾均沒有填充。必須使用 __packed 聲明壓縮結(jié)構(gòu)的所有子結(jié)構(gòu)??梢詥为?dú)壓縮非壓縮結(jié)構(gòu)的整型子字段。
用法
若要將結(jié)構(gòu)映射到外部數(shù)據(jù)結(jié)構(gòu)或訪問未對(duì)齊數(shù)據(jù),__packed 限定符非常有用;但由于訪問開銷相對(duì)較高,通常對(duì)節(jié)省數(shù)據(jù)大小并沒有什么幫助。通過僅對(duì)需要壓縮的結(jié)構(gòu)中的字段進(jìn)行壓縮,可以減少未對(duì)齊訪問的數(shù)量。
限制
以下限制適用于使用 __packed 的場(chǎng)合:
1、__packed 限定符不能用于以前未使用 __packed 聲明的結(jié)構(gòu)。
2、與其他類型限定符不同,不能同時(shí)具有同一結(jié)構(gòu)類型的 __packed 版本和非 __packed 版本。
3、__packed 限定符不影響整型局部變量。
4、壓縮結(jié)構(gòu)或聯(lián)合與相應(yīng)的非壓縮結(jié)構(gòu)的分配不兼容。由于這些結(jié)構(gòu)具有不同的內(nèi)存布局,因此,將壓縮結(jié)構(gòu)分配給非壓縮結(jié)構(gòu)的唯一辦法是逐個(gè)字段進(jìn)行復(fù)制。
5、沒有定義對(duì) __packed 進(jìn)行類型轉(zhuǎn)換所產(chǎn)生的影響。也沒有定義將非壓縮結(jié)構(gòu)類型轉(zhuǎn)換為壓縮結(jié)構(gòu)類型所產(chǎn)生的影響??梢院戏ǖ貙⒅赶蛘偷闹羔橆愋惋@式或隱式轉(zhuǎn)換為指向壓縮整型的指針類型。也可以對(duì) char 類型進(jìn)行 __packed 類型轉(zhuǎn)換。
6、不存在壓縮數(shù)組類型。壓縮數(shù)組是指具有壓縮類型的對(duì)象數(shù)組。數(shù)組中沒有進(jìn)行填充。