我真的很惊讶我找不到这个已经问过的问题。我想知道 switch 语句需要多少代码空间,以及使用 const 查找表是否会更有效地满足我的需求。
typedef struct container{
type1 a;
type2 b;
type3 c;
}container;
static container d;
//option A
void foo(int num)
{
void* x;
switch (num)
{
case 1:
x = &d->a;
break;
case 2:
x = &d->b;
break;
case 3:
x = &d->c;
break;
default:
x = NULL;
break;
}
// do something with x
}
// option B
const void* lookup_table[] = {
d.a,
d.b,
d.c,
NULL
};
void foo(int num)
{
void* x = lookup_table[num];
// do something with x
}
switch 语句将如何分解成汇编,它在代码空间中会大多少?使用查找表而不是使用 switch 语句是否值得?
最佳答案
如果您可以将开关重写为对查找表的简单查找,那可能是最好的解决方案,尤其是在可能的索引密集的情况下,因为它也可能更具可读性。 (如果可能的索引不密集,您可能会浪费空间或使用更复杂的查找技术:二级表、哈希表、二分查找排序列表。这些可能比 switch 语句更好,但会更少可读。)一个好的编译器会努力匹配效率,但是,其中一些会产生与您完全相同的代码。
但在通常情况下,您需要的不仅仅是查找一个值,switch 语句几乎肯定更好。一个好的编译器会将 switch 语句编译成上述策略之一,并且它可能比您更了解给定目标平台的详细信息的最佳解决方案。
特别是,由于调用函数的开销,将 switch 语句转换为函数指针的索引查找,然后通过函数指针调用可能比 switch 语句慢得多。使用 switch 语句,编译器很可能会生成一个分支表,其中查找代码将与您手工构建的代码非常相似,但查找后所做的是一个简单的分支而不是函数调用。
关于c - 一条 switch 语句占用多少代码空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33765505/