ZHCUAV8W january 1998 – march 2023 66AK2E05 , 66AK2H06 , 66AK2H12 , 66AK2H14 , AM1705 , AM1707 , AM1802 , AM1806 , AM1808 , AM1810 , AM5K2E04 , OMAP-L132 , OMAP-L137 , OMAP-L138 , SM470R1B1M-HT , TMS470R1A288 , TMS470R1A384 , TMS470R1A64 , TMS470R1B1M , TMS470R1B512 , TMS470R1B768
编译器支持以下类型属性:
结构体和联合体类型都支持 packed 属性。如果使用了 --relaxed_ansi 选项,则在所有 ARM 目标上都受支持。请参阅 --unaligned_access 选项说明,了解更多有关编译器如何访问未对齐数据的信息。
压缩结构的成员在存储时会尽可能靠近彼此,并会忽略通常为保持字对齐而添加的额外填充字节。例如,假定一个 4 个字节的字大小通常在成员 c1 和 i 之间具有 3 个填充字节,在成员 c2 后具有另外 3 个填充字节,因此总大小为 12 个字节:
struct unpacked_struct { char c1; int i; char c2;};
不过,压缩结构的成员是字节对齐的。因此,以下示例中成员之间或之后没有任何填充字节,总共为 6 个字节:
struct __attribute__((__packed__)) packed_struct { char c1; int i; char c2; };
因此,数组中的压缩结构会压缩在一起,数组元素之间没有填充字节。
压缩结构的位字段是位对齐的。不是位字段的相邻结构成员的子节对齐方式不变。不过,相邻位字段之间没有填充位。
“packed”属性只能应用于结构体或联合体类型的原始定义。它不能通过 typedef 用于已定义的非压缩结构,也不能用于结构体或联合体对象的声明。因此,任意给定结构体或联合体类型都只能是压缩或非压缩,并且该类型的所有对象都会继承其 packed 或 non-packed 属性。
“packed”属性不能递归应用到压缩结构体中包含的结构体类型。因此,在以下示例中,成员会保留与上方第一个示例相同的内部布局。c 和 s 之间没有填充字节,因此 s 在未对齐的边界上:
struct __attribute__((__packed__)) outer_packed_struct { char c; struct unpacked_struct s; };
以隐式或显式方式将压缩结构体成员的地址作为指针投射到除无符号字符以外的任意非紧凑类型都是非法的。在以下示例中,p1、p2 和对 foo 的调用都是非法的。
void foo(int *param);
struct packed_struct ps;
int *p1 = &ps.i;
int *p2 = (int *)&ps.i;
foo(&ps.i);
不过,以显式方式将压缩结构体成员的地址作为指针投射到无符号字符则是合法的。
unsigned char *pc = (unsigned char *)&ps.i;
TI 编译器还支持枚举类型的 unpacked 属性,让您可以指示表现形式为不小于 int 的整型;也就是说,它不是 packed。