5
gcc的__attribute __((packed))/ #pragma pack是否不安全?
在C语言中,编译器将按声明的顺序对结构的成员进行布局,并在成员之间或最后一个成员之后插入填充字节,以确保每个成员正确对齐。 gcc提供了语言扩展名,__attribute__((packed))它告诉编译器不要插入填充,从而使结构成员无法对齐。例如,如果系统通常要求所有int对象具有4字节对齐,则__attribute__((packed))可能导致int以奇数偏移量分配结构成员。 引用gcc文档: “ packed”属性指定变量或结构字段应具有最小的对齐方式-变量一个字节,一个字段一位,除非您使用“ aligned”属性指定更大的值。 显然,使用此扩展名可能会导致数据需求较小,但代码速度却很慢,因为编译器必须(在某些平台上)生成代码以一次访问一个未对齐的成员一个字节。 但是,在任何情况下这都不安全吗?编译器是否总是生成正确的(尽管速度较慢)代码以访问打包结构中未对齐的成员?是否在所有情况下都可能这样做?
164
c
gcc
pragma-pack