从汇编角度看C/C++函数指针与函数的调用差异
函数指针本质上是一个指针变量,只不过这个变量保存的地址是一个函数的地址,那么直接调用函数和通过函数指针调用有没有区别呢?答案是有的,下面的代码是一个直接调用函数和通过指针调用函数的例子,使用gdb反汇编main函数可以发现,直接调用函数对应的汇编指令是call 函数地址,而通过指针调用函数时,首先将函数的地址赋值给一个通用寄存器,call指令通过这个寄存器跳转到对应的函数,相对于直接调用,指针调用有个中转的过程。
#include <stdio.h>
void f()
{
printf("hello %d\n", 1);
}
int main(int argc, char **argv)
{
f();
void (*g)() = f;
g();
return 0;
}