C++ 为什么结构字节中位字段的顺序不是由语言本身定义的?

C++ 为什么结构字节中位字段的顺序不是由语言本身定义的?,c++,struct,endianness,bit-fields,C++,Struct,Endianness,Bit Fields,今天我遇到了一个问题,我发现字节中的位字段的排序方式取决于处理器的endianness。举下一个例子: 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说过,实现跨平台的可移植性是一个主要

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

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说过,实现跨平台的可移植性是一个主要目标,但留下一些类似的东西根本就不可移植。如果我通过连接将此结构发送给某人,他如何知道哪些位映射到结构中的哪些字段?如果订单是固定的,不是更容易吗?选择让处理器和编译器来处理这个问题的原因是什么?唯一安全的选择是使用位移位和掩码,这将使用更多的代码。如果我和我的同事们能够依靠一个固定的顺序,比如说小endian的方式,那就容易多了,但选择不这样做肯定是有原因的。

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

struct bf
{
    uint16_t a : 5;
    uint16_t b : 11;
};
为了使字段的位在内存中相邻,字节中的位必须根据处理器的端性进行不同的布局

大端语:

aaaaabbb bbbbbbbb
小恩迪亚:

bbbbbbbb bbbaaaaa

可能与处理器的端性无关,而与编译器编写者的任意决定有关。这个问题是你用什么语言编写的?@ MalRasSOM,他问的是为什么语言首先决定编译器编写者。C++也不决定关于填充的内存布局,所以你在布线上的论点不成立。不管你问哪里,你都会得到猜测。我得问问Stroustrup,C中的规则是这样的;C++继承了C的规则,C中的规则是这样的,因为标准化时的世界(编译器)的状态与规则所暗示的一样混乱。C89/C90标准委员会试图避免以这样一种方式指定标准,即工作的编译器在不破坏用户为其编写的代码的情况下无法与之兼容。