gpt4 book ai didi

c++ - 当使用位域 union 替换位掩码时,访问非事件成员,好还是未定义?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:16 25 4
gpt4 key购买 nike

来自 this question我了解到匿名结构和 union 已成为 C11 标准的一部分(来自评论)。然后我想用bitfield union来代替bitmask可能是个好主意,我发现其他人已经发布了一个问题并显示了an example。 ,这和我的想法完全一样。该问题的答案同意使用位域 union 方法替换位掩码的安全性。但是,the post there 的答案,据我了解,否认访问不活跃的 union 成员的安全性,说访问不活跃的 union 成员是未定义的行为。我认为这两个问题的答案是矛盾的:

仅使用 the example there ,在修改.user后,.raw的值会变成undefined(通过对the post的回答)。所以我觉得用bitfield union的方式来代替bitmask是不安全的。

我说的对吗?或者我误解了这些答案?

编辑:如果我的问题的答案对于 C 和 C++ 是不同的,我希望知道它们。

最佳答案

你是对的:在某些情况下, union 位域可能足以满足你的目标,但作为一般方法它不是可移植和安全的,因为机器字是如何在内存中存储或访问的.

C11 允许您根据需要重新解释数据,而 C++11 明确不允许这样做 (9.5.1)。如果您希望机器字位在任何地方都以特定顺序排列,您就不能期望拥有可移植代码。

如果你以字节方式读/写它们,就不会有问题,但只要在其他平台上的可移植性和安全性受到威胁,你就不能真正期望在存储整数时找到相同的内部位格式在大端机器或小端机器上。

关于c++ - 当使用位域 union 替换位掩码时,访问非事件成员,好还是未定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25831653/

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