所以我正在用 C++ 编程,据我所知,没有与 stdint.h 等效的 C++。这没问题,因为您只需获取 stdint 的拷贝并将其包含在内……但我的问题基本上是这样的,
这两段代码有什么区别:
struct FREQ{
unsigned int FREQLOHI :16;
//etc...
};
和
struct FREQ{
uint16_t FREQLOHI;
//etc...
}
除了位域的明显限制外,是否存在性能/可移植性问题?哪个更受欢迎?
最佳答案
区别在于unsigned int
在不同平台上可能有不同的大小,而uint16_t保证有16位宽度。这意味着第一个(位域)结构的实例在不同平台上可能具有不同的大小。此外,位域访问的成本更高,因为它涉及额外的移位和掩码。
例如,在 unsigned int 为 32 位宽的笔记本电脑上,第一个结构为 32 位宽,而第二个结构为 16 位。
在可移植性方面,位域的情况要清楚得多,因为它是 C++ 中的一项旧 C 语言功能,在 1998 年标准化时 (ISO/IEC 14882:1998)。另一方面,stdint.h
仅在 1999 年才添加到 C(ISO/IEC 9899:1999 标准),因此不是 C++98(ISO/IEC 14882:1998)的一部分。相应的 header cstdint
随后被合并到 C++ TR1 中,但它将所有标识符放在 std::tr1
命名空间中。 Boost 还提供了 header 。最新的 C++ 标准(C++11 又名 ISO/IEC 14882:2011,于 2011 年 9 月发布)包含 header cstdint
并将所有标识符放入 std
命名空间。尽管如此,cstdint
仍得到广泛支持。
关于c++ - 位字段与 stdint 定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8027776/