最佳答案
在 C 语言中,编译器将按照声明的顺序布局结构的成员,在成员之间或最后一个成员之后插入可能的填充字节,以确保每个成员正确对齐。
Gcc 提供了一个语言扩展 __attribute__((packed))
,它告诉编译器不要插入填充,从而允许结构成员不对齐。例如,如果系统通常要求所有 int
对象都具有4字节对齐,则 __attribute__((packed))
可能导致以奇数偏移量分配 int
结构成员。
引用海湾合作委员会的文件:
“ pack”属性指定变量或结构字段 应该具有尽可能小的对齐方式——对变量使用一个字节, 属性指定一个较大的值,则为字段指定一个位 “对齐”属性。
显然,这种扩展的使用可能导致较小的数据需求但较慢的代码,因为编译器必须(在某些平台上)生成代码来一次访问一个错误对齐的成员一个字节。
但是有没有不安全的情况呢?编译器是否总是生成正确(尽管较慢)的代码来访问封装结构的不对齐成员?它是否有可能在所有情况下都这样做?