关于__attribute__ ((packed))修饰单成员位字段结构体是否生成1位结构体的疑问
关于__attribute__ ((packed))修饰单成员位字段结构体是否生成1位结构体的疑问
嘿,这个问题问得挺细致的!我来帮你拆解一下GCC里__attribute__ ((packed))的具体行为,尤其是你提到的这个单成员位字段的情况。
首先咱们先回顾一下你看到的GCC文档描述:
packed
The packed attribute specifies that a variable or structure field should have the smallest possible alignment—one byte for a variable, and one bit for a field, unless you specify a larger value with the aligned attribute.
这里的关键点是:packed属性是针对字段或变量的对齐要求,但结构体作为一个整体,受限于C语言的基础规则——任何结构体类型的对象都必须拥有唯一的内存地址,而系统的最小可寻址单位是字节。
那回到你的代码示例:
struct bar { char a:1 __attribute__ ((packed)); };
即使你给这个1位的位字段加上了packed属性,这个结构体的大小依然是1字节,而不是所谓的“1位”。原因很简单:
- 位字段本身是在一个字节内部分配的,
packed确实会让这个位字段紧密排列(这里因为只有一个字段,其实有没有packed对字段的位置影响不大); - 但结构体作为一个独立的对象,必须占据至少一个完整的字节空间——你没法在内存中寻址到单独的1位,所有的内存访问都是以字节为最小单位的。
如果你实际用sizeof(struct bar)去测试的话,得到的结果肯定是1。packed属性的作用是消除结构体内部的对齐填充(比如你文档里提到的struct foo,如果没有packed,char a后面会有几个字节的填充来对齐int数组),但它不能突破C语言对结构体对象的最小尺寸限制。
备注:内容来源于stack exchange,提问作者Glitch
相关产品推荐
相关产品推荐

