【问题标题】:C++ does the integer size matter when using bitfields?C++ 使用位域时整数大小是否重要?
【发布时间】:2021-05-08 04:46:03
【问题描述】:

除了有符号或无符号之外,类型对位域有多大影响(如果有的话)?

例如有什么区别:

unsigned char a : 3;
std::uint64_t b : 3;

我猜只要位域不大于类型,没关系。

【问题讨论】:

  • 它影响它声明的结构或类的大小:godbolt.org/z/1broTWxsY
  • a 需要 1 个字节,b 需要 8 个字节。
  • 它是实现定义的。它可能会影响用于位域的分配单元大小,也可能不会。
  • 它是实现定义的,它如何影响包含类型的布局。但是,在您的示例中访问yourbitfield.a 的值(其中yourbitfield 是包含您描述的两个位文件的类型的实例)将产生unsigned char 的结果,访问yourbitfield.b 将产生类型的结果std::uint64_t。所以x = yourbitfield.a 将把字段a 提取为unsigned char,并将其提升为x 的类型以完成分配。

标签: c++ bit-fields


【解决方案1】:

由编译器决定如何布置这些值。结果对象必须足够大以容纳适合位域位数的值。例如,struct { std::unit64_t b : 8 } 的大小可以是 8 位;它不需要足够大以容纳 64 位。

但是每个位域都有一个类型,类型会影响程序的行为。这是一个简单的例子:

#include <iostream>

void f(char) {
    std::cout << "char\n";
}

void f(int) {
    std::cout << "int\n";
}
struct a {
    char a : 3;
    int b : 3;
};

int main()
{
    a obj;
    f(obj.a);
    f(obj.b);
    return 0;
}

(完全可移植的)输出是:

[temp]$ clang++ test.cpp
[temp]$ ./a.out
char
int
[temp]$ 

【讨论】:

    【解决方案2】:

    C++ 在使用位域时整数大小是否重要?

    是的,确实如此。

    例如有什么区别:

    unsigned char a : 3;
    std::uint64_t b : 3;
    

    第一个位域的类型是unsigned char,另一个位域的类型是std::uint64_t。在大多数系统上,这些类型具有不同的大小。

    有没有实际作用

    这是一个演示实际效果的简单示例:

    struct a {
        unsigned char a : 3;
    };
    
    struct b {
        std::uint64_t b : 3;
    };
    
    int main()
    {
        std::cout << sizeof(a) << ' ' << sizeof(b);
    }
    

    【讨论】:

    • 当位域将它们限制为每个 3 位时,这有什么实际效果吗?
    • 该示例中的每个位域都是 3 位宽。它们不需要每个占用超过 3 位。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 2017-06-10
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    相关资源
    最近更新 更多