arm编程中__packed的使用
扫描二维码
随时随地手机看文章
今天在看代码的时候看到以下代码:
structdsi_ctrl_hdr{
chardtype;/*datatype*/
charlast;/*lastinchain*/
charvc;/*virtualchan*/
charack;/*askACKfromperipheral*/
charwait;/*ms*/
shortdlen;/*16bits*/
}__packed;
结构体的末尾用__packed进行限定。因为不懂其用法,于是通过百度整理了__packed的作用及用法。
__packed 限定符将所有有效类型的对齐边界设置为 1。这就意味着:
1、不会插入填充以对齐压缩对象
2、使用未对齐的访问读取或写入压缩类型的对象。
使用 __packed 限定符声明结构或联合后,__packed 将应用于该结构或联合的所有成员。成员之间或结构末尾均没有填充。必须使用 __packed 声明压缩结构的所有子结构。可以单独压缩非压缩结构的整型子字段。
用法
若要将结构映射到外部数据结构或访问未对齐数据,__packed 限定符非常有用;但由于访问开销相对较高,通常对节省数据大小并没有什么帮助。通过仅对需要压缩的结构中的字段进行压缩,可以减少未对齐访问的数量。
限制
以下限制适用于使用 __packed 的场合:
1、__packed 限定符不能用于以前未使用 __packed 声明的结构。
2、与其他类型限定符不同,不能同时具有同一结构类型的 __packed 版本和非 __packed 版本。
3、__packed 限定符不影响整型局部变量。
4、压缩结构或联合与相应的非压缩结构的分配不兼容。由于这些结构具有不同的内存布局,因此,将压缩结构分配给非压缩结构的唯一办法是逐个字段进行复制。
5、没有定义对 __packed 进行类型转换所产生的影响。也没有定义将非压缩结构类型转换为压缩结构类型所产生的影响。可以合法地将指向整型的指针类型显式或隐式转换为指向压缩整型的指针类型。也可以对 char 类型进行 __packed 类型转换。
6、不存在压缩数组类型。压缩数组是指具有压缩类型的对象数组。数组中没有进行填充。