我有兩個枚舉正是如此定義當索引不連續時,設置查找表的最佳方式是什麼?
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