gpt4 book ai didi

c++ - C++ 位域为什么以及如何不可移植?

转载 作者:可可西里 更新时间:2023-11-01 15:46:29 25 4
gpt4 key购买 nike

我遇到过很多关于位域的各种问题的评论,这些评论断言位域是不可移植的,但我一直无法找到准确解释原因的来源。

从表面上看,我会假设所有位域仅编译为相同位移位代码的变体,但显然它必须比这更多,否则就不会对它们产生如此强烈的反感。

所以我的问题是是什么导致位域不可移植?

最佳答案

位域是不可移植的,就像整数是不可移植的一样。您可以使用整数来编写可移植程序,但您不能期望将 int 的二进制表示原样发送到远程计算机并期望它正确解释数据。

这是因为 1. 处理器的字长不同,因此,整数类型的大小也不同(1.1 字节长度也可能不同,但如今在嵌入式系统之外很少见)。并且因为 2. 不同处理器的字节序不同。

这些问题很容易克服。 native 字节序可以很容易地转换为商定的字节序(大字节序是网络通信的事实上的标准),并且可以在编译时检查大小,并且现在可以使用固定长度的整数类型。因此,只要处理好这些细节,整数就可以用于跨网络通信。

位字段建立在常规整数类型之上,因此它们在字节顺序和整数大小方面存在相同的问题。但是他们有even more实现指定的行为。

  • Everything about the actual allocation details of bit fields within the class object

    • For example, on some platforms, bit fields don't straddle bytes, on others they do
    • Also, on some platforms, bit fields are packed left-to-right, on others right-to-left
  • Whether char, short, int, long, and long long bit fields are signed or unsigned (when not declared so explicitly).

与字节顺序不同,将“关于实际分配细节的所有内容”转换为规范形式并非易事。

此外,虽然字节序是特定于 CPU 架构的,但位域细节是特定于编译器实现者的。因此,即使在同一台计算机内的不同进程之间,位字段也不能用于通信,除非我们可以保证它们是使用相同(或二进制兼容)的编译器编译的。


TL;DR 位字段不是计算机之间通信的可移植方式。整数也不是,但它们的不可移植性很容易解决。

关于c++ - C++ 位域为什么以及如何不可移植?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38197460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com