C++ 中位字段的特征

Characteristics of bit-Fields in C++

提问人:wimalopaan 提问时间:1/30/2023 最后编辑:wimalopaan 更新时间:1/30/2023 访问量:145

问:

https://en.cppreference.com/w/cpp/language/bit_field 读,以下结论正确吗?

  • 相邻位域之间是否没有填充是由实现定义的(这在 https://eel.is/c++draft/class.bit#:bit-field 中读起来不同)
  • 位字段在类对象中的位置是实现定义的
  • 位域内位的位置是实现定义的(尽管 C++20 将有符号整数定义为 2 分之一补码)。

(对于 C,请参阅:C 中位字段的特征)

C++ 语言律师 位域 实现定义行为

评论

1赞 463035818_is_not_an_ai 1/30/2023
“类对象中位域的分配是实现定义的。位域的对齐是实现定义的。 这难道不能回答你的问题吗?为什么不呢?
0赞 wimalopaan 1/30/2023
因为我看到了 C 特征(尤其是填充)的差异,并且我看到这些定义依赖于许多 μC 标头中的无填充(填充位字段),这并不妨碍在 C++ 中使用它们。
1赞 463035818_is_not_an_ai 1/30/2023
“已定义实现”意味着它由实现定义和记录(!)。这并不意味着任何依赖和指定的代码都自动出错。这仅意味着它不一定是便携式的
3赞 Richard Critten 1/30/2023
[class.bit] “[注 1:位字段在某些机器上跨分配单元,而在其他机器上则不然。位域在某些计算机上从右到左分配,在其他计算机上从左到右分配。— 尾注]”。也就是说,如果你想要一个可移植的固定布局,你就不能使用位域。
1赞 wimalopaan 1/30/2023
这个问题有三个非常明确的要点,指向一种语言中的一个特定功能。因此,得到一个包含问题所有三点的答案会很有帮助。

答:

2赞 ryyker 1/30/2023 #1

“这个问题有三个非常明确的要点,指向一种语言中的一个特定功能。因此,得到一个答案会很有帮助 包括问题的所有三点”

逐个寻址点

简而言之,结论是,不能保证各种新 C++ 规范之间的位域实现是一致的。因此,从一个 C++ 实现到另一个实现的可移植性是困难的,如果不是不可能的话,强制要求任何使用它的应用程序都必须查阅支持正在使用的 C++ 编译器的规范和其他文档,以确保其实现(规则)关于如何实现填充或位域的其他属性。