当前位置: 首页 > article >正文

从汇编角度看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;
}


http://www.kler.cn/news/366055.html

相关文章:

  • PostgreSQL使用clickhouse_fdw访问ClickHouse
  • 软件测试人员必问的十大面试题..
  • java项目之基于web的智慧社区设计与实现(springboot)
  • 【Flutter】状态管理:Provider状态管理
  • 【WebGis开发 - Cesium】三维可视化项目教程---图层管理拓展图层顺序调整功能
  • Python游戏开发超详细第二课/一个小游戏等制作过程(入门级篇共2节)
  • 甘特图代做服务
  • 银河麒麟相关
  • 若依 spring boot +vue3 前后端分离
  • Java语言的充电桩系统-云快充协议1.5-1.6
  • 互联网系统的微观与宏观架构
  • 重构案例:将纯HTML/JS项目迁移到Webpack
  • Nginx、Tomcat等项目部署问题及解决方案详解
  • 从零开始:构建一个高效的开源管理系统——使用 React 和 Ruoyi-Vue-Plus 的实战指南
  • C++核心编程和桌面应用开发 第十五天(deque/stack/queue)
  • ubuntu 20.04修改DNS
  • 高并发场景下解决并发数据不一致
  • 自然语言处理:第五十五章 RAG应用 FastGPT 快速部署
  • pair类型应用举例
  • C++ 算法学习——1.3 Prim算法
  • python操作CSV和excel,如何来做?
  • <项目代码>YOLOv8煤矿输送带异物识别<目标检测>
  • 安装Vue CLI的详细指南
  • 数据采集与数据分析:数据时代的双轮驱动
  • 零基础Java第十期:类和对象(一)
  • Mybatis mapper文件 resultType和resultMap的区别