所以我用C ++编程,据我所知,没有C ++等同于stdint.h。哪个没问题,因为你可以抓住一份stdint并包含它...但我的问题基本上就是这个,
这两段代码之间有什么区别:
struct FREQ{
unsigned int FREQLOHI :16;
//etc...
};
和
struct FREQ{
uint16_t FREQLOHI;
//etc...
}
除了位域的明显限制外,是否存在性能/可移植性问题?哪个更受欢迎?
答案 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
得到了广泛支持。