位字段中的字段是否具有其元素的连续内存位置?此行为编译器是独立的吗?

时间:2014-06-09 11:45:56

标签: c compiler-construction struct bit-manipulation

在C中的位字段中,其元素的内存位置是否连续? 如果是,所有编译器的行为是否相同?

示例:

typedef struct
{
   uint8_t        in_alarm      :1;
   uint8_t        fault         :1;
   uint8_t        overridden    :1;
   uint8_t        out_of_service:1;
}StatusFlag_t;

字段in_alarm,fault等是否有连续的内存位置?

3 个答案:

答案 0 :(得分:3)

根据C标准,位域处理的几乎每个方面都依赖于编译器。很可能你的结构中的4位在单个字节中是连续的,但不能保证它们是否是最重要或最不重要的4位。如果超过8位,则值将跨越多个存储单元(因为基类型为uint8_t;请注意,C标准不要求编译器支持使用uint8_t作为位域的类型)。注意,位字段成员通常没有不同的地址;你不能获取位字段元素的地址。

无法保证不同编译器在不同平台上的行为相同。通常有一个ABI(应用程序二进制接口),它定义特定O / S的行为,编译器将遵循运行它的平台的ABI。但是C标准没有强制要求这种行为。

对于标准中的相关引用,请参阅(以及其他可能性)How do bit-fields and their alignments work in C programming?

答案 1 :(得分:0)

嗯,他们没有内存位置,因为它们不到字节。你不能把指针指向一个位域。

应尽可能将字段打包在一起。

正式确切的位分配是实现定义的。它可能在编译器之间有所不同。

在实践中,3个主要编译器,Gcc,CLang和VisualC ++也做同样的事情。

答案 2 :(得分:-1)

Bits实际上只在一个内存位置。一个位置对应于8位。 顺序可以是编译器相关的,即结构元素的第一位(在你的情况下是in_alarm)应该在MSB或LSB位置。(至少我的编译器有一个选项来设置它。)

编辑: 由于答案被低估了,我不知道为什么,我正在粘贴我的编译器设置快照来解释我想要表达的内容:

enter image description here