据我所知,编译器会为连续的大型 switch case 代码块、C++ 的虚函数表以及某些尾调用情况生成间接跳转。此外,还可以间接调用(而不是跳转)函数指针。还有其他情况可以使用间接跳转吗?
此外,我们能否告诉编译器(首选 clang/llvm)除非必要,否则不要生成间接调用?
这个问题可能很奇怪,因为我正在对此进行一些研究。
最佳答案
间接跳转或调用通常涉及指针数组(地址)。除了 switch case 序列之外,Microsoft 编译器在 Debug模式下构建时还会生成指向函数的指针数组(我很确定这不是在 Release模式下完成的)。我不知道如何禁用它。还有一个用于切换上下文(或只是更改权限级别)的间接调用,但这对于普通 C/C++ 代码来说不应该是问题。
关于c - 编译器什么时候会为x86_64生成C语言的间接跳转?我们可以告诉编译器禁用生成间接跳转吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27206108/