位字段与stdint定义

时间:2011-11-06 14:43:06

标签: c++ bit-fields stdint

所以我用C ++编程,据我所知,没有C ++等同于stdint.h。哪个没问题,因为你可以抓住一份stdint并包含它...但我的问题基本上就是这个,

这两段代码之间有什么区别:

struct FREQ{
    unsigned int FREQLOHI :16;
    //etc...

};

struct FREQ{
    uint16_t FREQLOHI;
    //etc...
}

除了位域的明显限制外,是否存在性能/可移植性问题?哪个更受欢迎?

1 个答案:

答案 0 :(得分:4)

区别在于unsigned int在不同平台上可能具有不同的大小,而uint16_t保证具有16位宽度。这意味着第一个(位域)结构的实例在不同平台上可能具有不同的大小。此外,位域访问更昂贵,因为它涉及额外的移位和掩码。

例如,在unsigned int为32位宽的笔记本电脑上,第一个结构为32位宽,而第二个结构为16位。

在可移植性方面,位字段处于更清晰的状态,因为它是一种旧的C语言特性,当它在1998年被标准化时被包含在C ++中(ISO / IEC 14882:1998)。另一方面,stdint.h仅在1999年被添加到C(ISO / IEC 9899:1999标准),因此不是C ++ 98(ISO / IEC 14882:1998)的一部分。然后将相应的标头cstdint合并到C ++ TR1中,但它将所有标识符放在std::tr1命名空间中。 Boost还提供了标题。最新的C ++标准(2011年9月发布的C ++ 11又称ISO / IEC 14882:2011)包含标头cstdint,它将所有标识符放入std命名空间。尽管如此,cstdint得到了广泛支持。