【发布时间】:2012-08-30 11:24:23
【问题描述】:
我有一个多线程应用程序,它将数据存储为以下联合的实例数组
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 访问联合的任何部分,而该部分不是最后写入的部分(写起来很麻烦,但我想不出更清晰的说法)我想知道如果上面的代码是检查我的联合实例是否相等的有效方法??
这让我意识到,在内部我不知道工会是如何运作的。我曾假设数据只是存储为位模式,并且您可以根据联合中列出的类型以您喜欢的任何方式解释它。 如果不是这种情况,那么测试联合的 2 个实例是否相等的安全/正确方法是什么?
最后,我的应用程序是用 C++ 编写的,但我意识到联合也是 C 的一部分,那么这两种语言对它们的处理方式有什么不同吗?
【问题讨论】:
-
将联合包装在一些结构中,以记住上次写入的字段。
-
至于位模式,是的,您是对的,但请记住,并非所有位模式都是有效的浮点数。此外,如果您在联合中有一个
char和一个long,那么写入char不会导致long包含与long相同的数字,因为long有可能是任何东西的额外位。 -
@JoachimPileborg 是的,你是对的 - 我应该指定这个问题专门针对这种情况,我的两种类型的长度都是 4 个字节。我明白你在说什么。