c - 一条 switch 语句占用多少代码空间?

标签 c optimization switch-statement lookup-tables low-memory

我真的很惊讶我找不到这个已经问过的问题。我想知道 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/

相关文章:

javascript - 三元运算的值范围在负值和正值范围内直到 0?

c - C 中的文件处理

objective-c - 问号和冒号是什么意思(?: ternary operator) mean in objective-c?

c++ - float 0.1 和 0.5 的精度在 c 中如何变化

python - 我可以使用机器学习模型作为优化问题的目标函数吗?

Java ATM 项目逻辑错误

c - 尝试将两个数组指针传递给随机交换它们的函数时出现段错误

ios - A block 带有 UI 回调的 for 循环

function - 在函数中间更改参数的值

eclipse - 如何使用 eclipse 的代码格式化程序删除 'case' 之后的新行?