首页 > 编程语言 >[c/c++] 使用函数指针会导致程序变慢

[c/c++] 使用函数指针会导致程序变慢

时间:2022-11-12 10:05:01浏览次数:67  
标签:调用 函数 变慢 c++ 函数指针 动态 连接 指针


参考:

​c - Does Function pointer make the program slow? - Stack Overflow​

正文:

使用函数指针会导致程序变慢,比如先把某个函数的指针保存下来,然后调用这个指针比直接调用这个函数会慢一点,从汇编层面来看,直接调用函数是直接访问函数地址,调用函数指针则需要先读指针内的值然后再跳转到指定位置执行,其实这并不会带来太大的延迟。

如果! 保存动态库里面某个函数的地址并存储到指针,再调用,而且还是LAZY模式,那么这个过程既跨二进制文件,又使用了动态加载,这里可能就会非常慢了。

实际的场景:

很多跨二进制文件注册回调函数的场景下会比较常见,因为回调函数都是函数指针,且往往都是用在跨二进制文件场景中。

解决:

如果库的体积不是很大,那么可以考虑静态连接,而不是使用动态连接;

如果内存资源相对宽裕,那么可以考虑静态连接,而不是使用动态连接;

如果系统是64位系统,或者程序运行时内存不是很大,也可以考虑静态连接,而不是动态连接。

最后:

某些cpu和内存极端情况下,一个简单的函数指针调用可能会卡 数秒。

标签:调用,函数,变慢,c++,函数指针,动态,连接,指针
From: https://blog.51cto.com/u_15803983/5846514

相关文章

  • c++ bit 库用法
    c++20加入了一个叫做bit的库,不如来看看里面有什么?bit_cast效果和reinterpret_cast类似,按二进制位取值,constexprfloatN=100;constexprintM=std::bit_cast<int>......
  • 最大公约数 C/C++ leetcode , 辗转相除,更相减损
    #include <iostream>using namespace std;// 辗转相除法求最大公约数,用大的模小的,然后用除数模余数,该接口在新版的C++17的numeric 包中也有int gcd1(int a ,......
  • C++二维数组最大值
    C++二维数组最大值【问题描述】求二维整型数组的"最大点"。二维数组的"最大点"定义为:某个数是所在行的最大值,并且是所在列的最大值。注意:某行或某列上可能有多个"最大点"......
  • C温故补缺(七):函数指针与回调函数
    函数指针与回调函数函数指针就是指向函数调用栈地址的指针,定义时须和函数的返回值类型,参数类型相同如:#include<stdio.h>intmax(intx,inty){returnx>y?x:y;......
  • 【leetcode_C++_二叉树_day12】层序遍历 10 && 226.翻转二叉树&&101. 对称二叉树
    1.层序遍历学会二叉树的层序遍历,可以一口气打完以下十题:102.二叉树的层序遍历107.二叉树的层次遍历II199.二叉树的右视图637.二叉树的层平均值429.N叉树的层序遍......
  • 周六1900C++班级2022-11-12-多组数据
    一、多组数据输入在TZOJ练习平台上,经常会见到一些题目说输入数据有多组、输入以EOF结束、当输入的数据为0时结束等等的题目描述,那么这些输入具体是如何去解决呢?1.有明确......
  • C++学习笔记
    C++学习笔记!这是刚开始写的文件,后来发现太大不合适就开始分开写了#include<iostream>#include<string>//c++风格字符串头文价//下面是定义宏常量:宏常量一旦定下,下文就......
  • 浅谈 c++ adl 机制
    namespacef1{ namespacef2{ structcow{ friendvoidsolve(cow){cout<<"f1::f2::cow";} }; } voidsolve(f2::cow){cout<<"f1\n";} namespacef2{ voidso......
  • C++代码实现计算组合数(3种计算方式)
    题目:输入两个非负整数n和m,返回组合数\(C^m_n\)。例如当n=10,m=2时,答案为45。组合与排列先从排列数开始说起,排列数是指从n个不同的元素中任意取出m(\(m\leqn\))个......
  • 浅谈 c++20 ranges 的用法
    ranges库是c++20开始具有的语法,对应的头文件是#include<ranges>。为了防止CE我一般都这么写:#if__cplusplus>=202002L#include<ranges>usingnamespacestd::view......