考虑类似 C 语言中的典型枚举类型,如下所示:
enum foo {
FOO_A,
FOO_B,
FOO_C,
/* ... */
FOO_N
};
对 type 的值有 switch 语句enum foo
,可能不处理某些枚举值:
enum foo bar;
/* ... */
switch (bar) {
case FOO_A: /* ... */
case FOO_B: /* ... */
case FOO_D: /* ... */
case FOO_L: /* ... */
default: /* ... */
}
现在,为了处理足够多的枚举值,编译器将使用大小为(<highesthandled value> - <lowesthandled value> + 1) * sizeof(void*)的跳转表来实现 switch 语句。
考虑一下我有多个已知使用跳转表的这样的 switch 语句,因为每个语句都知道哪些值正在被处理,哪些值没有被处理。如何enum foo
以某种方式重新排序值,以使生成的所有跳转表的总大小最小?
例子
这是一个稍微简化的示例,它假设编译器为所有 switch 语句生成跳转表。这是枚举:
enum example {
EX_A,
EX_B,
EX_C,
EX_D
};
这些是两个开关语句:
enum example a, b;
switch (a) {
case EX_A: /* ... */
case EX_C: /* ... */
default: /* ... */
}
switch (b) {
case EX_B: /* ... */
case EX_D: /* ... */
default: /* ... */
}
对于此示例,编译器将生成两个跳转表,每个表包含三个条目(在第一种情况下 from EX_A
to EX_C
,在第二种情况下 from EX_B
to EX_D
),总计 6 个用于跳转表的机器字。如果我确实像这样重新排序枚举:
enum example {
EX_A,
EX_C,
EX_B,
EX_D
};
跳转表只需要 4 个数据字。