c++ - 位字段与 stdint 定义

标签 c++ bit-fields stdint

所以我正在用 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/

相关文章:

c++ - 从文件中读取数据

c++ - 如何使用位字段将数据从二进制文件复制到结构中?

c++ - 有没有一种可移植的方法来知道 uintptr_t 是否在 stdint.h 中定义?

c - 如何找到 uint_fast32_t 的宽度

C++ Eclipse 控制台将纯文本编码为其他字符

c++ - 如何以及何时使用构造函数模板?

c++ - 使用 GDI 以图像为中心的黑色背景

关于 C 中位域排序语义的说明

c - 使用零宽度字段进行位字段对齐