我的Prog.c包含一个简单的开关盒,如下所示:
switch (x)
{
case 1:
p=2;
break;
case 2:
p=3;
break;
case 3:
p=4;
break;
case 4:
p=5;
break;
case 5:
p=6;
break;
default:
break;
}
我用以下程序编译了该程序
gcc -g -v prog.c
并使用
创建objdumpobjdump -S -l a.out>dump_file
对于switch case语句,我发现已经创建了一个间接分支(jmp *%eax
)。
但是,如果我删除任何一条case语句,则不会创建任何间接分支。
gcc版本:5.4.0
我不明白为什么会这样?
答案 0 :(得分:0)
发生这种情况是由于Branch Tables。避免使用
进行编译 gcc -g -v -fno-jump-tables SO.c
如果使用跳转表进行编译[gcc编译器中的一项功能],dump_file
的大小为:9,965字节
但没有它,大小为:11,493字节。
跳转表可通过优化和重新定位一些跳转指令来帮助减少目标代码的大小。