【问题标题】:Why is the order of bit fields in the bytes of structs not defined by the language itself?为什么语言本身没有定义结构字节中位字段的顺序?
【发布时间】:2018-05-15 00:11:03
【问题描述】:

我今天遇到了一个问题,我发现我的字节中位字段的排序方式取决于我的处理器的字节序。举下一个例子:

struct S {
    uint8_t a : 3;
    uint8_t b : 5;
};

此结构占用一个字节,但位布局取决于机器:

  • 小端:b4 b3 b2 b1 b0 a2 a1 a0
  • 大端:a2 a1 a0 b4 b3 b2 b1

因此,在小端机器上,它从 LSB 开始填充,而在大端机器上,它从 MSB 开始填充。我曾经听 Stroustrup 说过,实现跨平台可移植性是一个主要目标,但留下一些像这样的东西根本就不能移植。如果我要通过连接将此结构发送给某人,他如何知道哪些位映射到结构中的哪些字段?如果订单是固定的,会不会更容易?选择将其留给处理器和编译器的原因是什么?唯一安全的选择是使用使用更多代码的位移位和掩码。如果我和我的同事可以依靠固定的顺序(例如小端方式)会容易得多,但选择不这样做肯定是有原因的。

【问题讨论】:

  • 可能与处理器的字节顺序无关,而与编译器编写者的任意决定有关。您使用哪些编译器观察到这一点?
  • @MarkRansom 他的问题是关于为什么语言首先将决定权留给编译器编写者。
  • C++ 也没有规定关于填充的内存布局,因此您的无线参数不成立。
  • 无论你在哪里问,你都会得到猜测。得问问 Stroustrup。
  • C中的规则是这样的; C++ 继承了 C 的规则。C 中的规则就是这样,因为当它被标准化时,世界(编译器)的状态就像规则所暗示的那样混乱。 C89/C90 标准委员会试图避免以某种方式指定标准,这意味着工作编译器在不破坏用户为其编写的代码的情况下无法与其兼容。

标签: c++ struct endianness bit-fields


【解决方案1】:

它们不是由语言定义的,因此它可以适应您发现的确切情况。对于字节中的位域,它没有区别,但位域可以占用更大的整数类型。考虑这个例子:

struct bf
{
    uint16_t a : 5;
    uint16_t b : 11;
};

为了使字段的位在内存中相邻,字节中的位必须根据处理器的字节序进行不同的布局。

大端:

aaaaabbb bbbbbbbb

小端:

bbbbbbbb bbbaaaaa

【讨论】:

    猜你喜欢
    • 2010-10-26
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2023-02-14
    • 2021-10-23
    • 1970-01-01
    • 2012-11-10
    • 2011-10-07
    相关资源
    最近更新 更多