今天在看代码的时候看到以下代码:
struct dsi_ctrl_hdr {
char dtype; /* data type */
char last; /* last in chain */
char vc; /* virtual chan */
char ack; /* ask ACK from peripheral */
char wait; /* ms */
short dlen; /* 16 bits */
} __packed;
结构体的末尾用__packed进行限定。因为不懂其用法,于是通过百度整理了__packed的作用及用法。
__packed 限定符将所有有效类型的对齐边界设置为 1。这就意味着:
1、不会插入填充以对齐压缩对象
2、使用未对齐的访问读取或写入压缩类型的对象。
使用 __packed 限定符声明结构或联合后,__packed 将应用于该结构或联合的所有成员。成员之间或结构末尾均没有填充。必须使用 __packed 声明压缩结构的所有子结构。可以单独压缩非压缩结构的整型子字段。
用法
若要将结构映射到外部数据结构或访问未对齐数据,__packed 限定符非常有用;但由于访问开销相对较高,通常对节省数据大小并没有什么帮助。通过仅对需要压缩的结构中的字段进行压缩,可以减少未对齐访问的数量。
限制
以下限制适用于使用 __packed 的场合:
1、__packed 限定符不能用于以前未使用 __packed 声明的结构。
2、与其他类型限定符不同,不能同时具有同一结构类型的 __packed 版本和非 __packed 版本。
3、__packed 限定符不影响整型局部变量。<