我有两个枚举正是如此定义当索引不连续时,设置查找表的最佳方式是什么?
enum foo {
foo_a = 0x1,
foo_b = 0x2,
foo_c = 0x4,
foo_d = 0x8,
foo_e = 0x10,
..etc..
}
和
enum bar {
bar_a = 0x1,
bar_b = 0x2,
bar_c = 0x4,
bar_d = 0x8,
bar_e = 0x10,
..etc..
}
现在,有foo_之间[AZ] bar_ 1对1的映射和[AZ],我想看看它迅速起来。最明显的方式做到这一点是做一些声明类似
int table[][] = {
[foo_a] = bar_c,
[foo_b] = bar_a,
[foo_c] = bar_b,
..etc..
}
,只是看它使用result = table[(enum foo)temp]
。但由于这些枚举已被逐位声明,所以table
的大小呈指数增长。
有没有更简单的方法来设置编译时的东西?
有一件事我认为做这样的事情
int table[][] = {
[LOG(foo_a)] = bar_c,
[LOG(foo_b)] = bar_a,
[LOG(foo_c)] = bar_b,
..etc..
}
这将减少内存占用,但我不知道反正来计算LOG在编译时。
其他建议?
我唯一的限制是以下内容,我无法修改枚举,因为更改它们会导致二进制不兼容。
编辑:编译时的解决方案首选
,我不得不问,你在计划什么“寻找(foo_a | foo_b)(这是首先使用位列作为唯一合乎逻辑的理由)的多位值的“*”替换为*。 – WhozCraig 2013-03-12 03:35:17
这些枚举是否真的具有*相同*可能的值?你可以从一个枚举类型转换为另一个变量吗? – chrisaycock 2013-03-12 03:37:26
@WhozCraig API实际上设计不正确。这些价值从来都不是要一起编辑的。我不明白他们为什么从来不打扰他们的顺序编号。 – 2013-03-12 03:40:18