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





