c - 编译器什么时候会为x86_64生成C语言的间接跳转?我们可以告诉编译器禁用生成间接跳转吗?

标签 c gcc compiler-construction clang llvm

据我所知,编译器会为连续的大型 switch case 代码块、C++ 的虚函数表以及某些尾调用情况生成间接跳转。此外,还可以间接调用(而不是跳转)函数指针。还有其他情况可以使用间接跳转吗?

此外,我们能否告诉编译器(首选 clang/llvm)除非必要,否则不要生成间接调用?

这个问题可能很奇怪,因为我正在对此进行一些研究。

最佳答案

间接跳转或调用通常涉及指针数组(地址)。除了 switch case 序列之外,Microsoft 编译器在 Debug模式下构建时还会生成指向函数的指针数组(我很确定这不是在 Release模式下完成的)。我不知道如何禁用它。还有一个用于切换上下文(或只是更改权限级别)的间接调用,但这对于普通 C/C++ 代码来说不应该是问题。

关于c - 编译器什么时候会为x86_64生成C语言的间接跳转?我们可以告诉编译器禁用生成间接跳转吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27206108/

相关文章:

compiler-construction - 如何在上下文无关文法中判断运算符的优先级

c - C 中 pi 的无限级数逼近不终止

c - 为什么链接程序需要 stdlib?

c - 我的 SHA256 哈希函数有什么问题?

c++ - 什么是 STL 容器的纯 C 替代品?

ios - ld : library not found for -lssl collect2: ld returned 1 exit status

java - 即时编译器和解释器有什么区别?

c - g-wan 不更新 servlet 的依赖项

c - 启动 execlp 作为后台进程

c - 获取jpeg图像的大小