gpt4 book ai didi

c++ - 如何比较两个 union 的排序

转载 作者:行者123 更新时间:2023-11-30 03:42:00 25 4
gpt4 key购买 nike

我有一个类充当 map 键,它包含两个成员

struct Key{
unsigned int type;
union{
Enumerator thing1;
int32 thing2;
struct{int16 a; bool b;} thing3;
... etc...
}data;

bool operator<(const Key & rh) const{
if(type == rh.type){
???
}else{
return type < rh.type;
}
}
}

第二个成员 data 是一个 union ,我不确定如何将它与另一个它的类型进行比较,这种方式与上次分配的 union 成员无关(小于中的一个开关运营商成本太高)

顺序并不重要,重要的是 map 将不同的值视为不同的值。有没有办法对两个 union 进行快速比较?

最佳答案

不,不可能有一个类型不可知的字节比较。 thing2thing3 有不同的字节数参与它们的值(即不同的填充量),所以你不能使用 std::memcmp 或原始内存的任何其他比较。

如果类型从 0 连续运行(或者无论如何,都是相当小的数字),那么您也许可以查找一个大小以从 type 索引的数组中进行比较,提供 所有 union 成员中的所有填充都在末尾,这样所有参与该值的字节都在开头。如果 bool 大于 int16 并且我们不知道 Enumerator 中的内容,thing3 可能已经无法通过此测试> 和 ...等等 ...

理论上,您可以使用由 type 索引的函数指针数组来避免 switch。但是,一旦优化器完成其工作,就没有特别的理由期望它比 switch 更快。一般来说,函数指针对内联来说是致命的,因此它们会削弱优化器和 CPU 自己的推测指令获取/执行。

顺便说一句,如果您不关心顺序,那么 std::unordered_map 通常会比 std::map 表现得更好,但您仍然有这个问题需要编写一个哈希函数,该函数只对参与值的字节进行哈希处理。

关于c++ - 如何比较两个 union 的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37068016/

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