我有一个多线程应用程序,它将数据存储为以下联合的实例数组
union unMember {
float fData;
unsigned int uiData;
};
存储此数组的对象知道联合中的数据是什么类型,因此在检索正确类型时我不会遇到 UB 问题。但是在程序的其他部分,我需要测试这些联合的 2 个实例之间的相等性,并且在这部分代码中,真正的内部数据类型是未知的。结果是我无法使用这种方法测试工会的平等性
unMember un1;
unMember un2;
if (un1 == un2) {
// do stuff
}
当我得到编译器错误时。因此,我只是比较联合的浮动部分
if (un1.fData == un2.fData) {
// compiles but is it valid?
}
现在鉴于我已经读到它是 UB 访问联合的任何部分,而该部分不是最后写入的部分(写起来很麻烦,但我想不出更清晰的方式来表达这一点)我想知道代码是否以上是检查我的联合实例是否相等的有效方法?
这让我意识到,在内部我不知道工会是如何运作的。我假设数据只是存储为位模式,并且您可以根据联合中列出的类型以您喜欢的任何方式解释它。如果不是这种情况,那么测试两个联合实例是否相等的安全/正确方法是什么?
最后,我的应用程序是用 C++ 编写的,但我意识到联合也是 C 的一部分,那么这两种语言对它们的处理方式有什么不同吗?