GCC的_属性_(包装)/#语用包不安全吗?
在C中,编译器将按照声明的顺序排列结构的成员,在成员之间插入可能的填充字节,或者在最后一个成员之后插入字节,以确保每个成员正确地对齐。
GCC提供了语言扩展,__attribute__((packed))
,它告诉编译器不要插入填充,从而允许结构成员对齐。例如,如果系统通常需要所有int
对象具有4字节对齐,__attribute__((packed))
能引起int
将在奇数偏移量处分配的结构成员。
引用GCC文献:
“打包”属性指定变量或结构字段应该具有最小的对齐方式-变量为一个字节,字段为一个位,除非您用“对齐”属性指定更大的值。
显然,使用这个扩展会导致较小的数据需求,但代码会更慢,因为编译器必须(在某些平台上)生成代码,以便一次访问错误对齐的成员。
但有什么不安全的情况吗?编译器是否总是生成正确(尽管速度较慢)代码来访问打包结构的错误对齐成员?它在所有情况下都有可能这样做吗?