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