c语言 函数指针开销,函数指针是否使程序变慢?

AnT..

82

您可以看到,在从性能角度来看实际上很重要的情况下,例如在一个周期中多次重复调用该函数,性能可能根本不同.

这对于人们来说可能听起来很奇怪,他们习惯于将C代码视为由抽象的C机器执行的,其机器语言与C语言本身密切相关.在这种情况下,"默认情况下"对函数的间接调用确实比直接调用慢,因为它正式涉及额外的内存访问以确定调用的目标.

但是,在现实生活中,代码由真实机器执行,并由优化编译器编译,该编译器非常了解底层机器架构,这有助于它为该特定机器生成最佳代码.在许多平台上,可能会发现从循环执行函数调用的最有效方法实际上会导致直接和间接调用的相同代码,从而导致两者的相同性能.

例如,考虑x86平台.如果我们"直接"将直接和间接调用转换为机器代码,我们可能最终得到类似的东西

// Direct call

do-it-many-times

call 0x12345678

// Indirect call

do-it-many-times

call dword ptr [0x67890ABC]

前者在机器指令中使用立即操作数,并且通常比后者更快,后者必须从某个独立的存储器位置读取数据.

在这一点上,让我们记住,x86架构实际上还有一种方法可以为call指令提供操作数.它在寄存器中提供目标地址.关于这种格式的一个非常重要的事情是它通常比上述两种都快.这对我们意味着什么?这意味着一个好的优化编译器必须并将利用这一事实.为了实现上述循环,编译器将尝试在两种情况下通过寄存器使用调用.如果成功,最终代码可能如下所示

// Direct call

mov eax, 0x12345678

do-it-many-times

call eax

// Indirect call

mov eax, dword ptr [0x67890ABC]

do-it-many-times

call eax

注意,现在重要的部分 - 循环体中的实际调用 - 在两种情况下都完全相同.毋庸置疑,性能几乎完全相同.

有人甚至说,但奇怪的是听起来,这个平台上直接调用(与立即数的调用call)是慢比只要间接调用中提供的操作数的间接调用寄存器(相存储在内存中).

当然,在一般情况下,整个事情并不那么容易.编译器必须处理有限的寄存器可用性,别名问题等.但是像你的例子中那样简单的情况(甚至在更复杂的情况下),上述优化将由一个好的编译器执行并将完全消除循环直接调用和循环间接调用之间的性能差异.当调用虚函数时,这种优化在C++中特别有效,因为在典型的实现中,所涉及的指针完全由编译器控制,使其充分了解别名图片和其他相关内容.

当然,总有一个问题是你的编译器是否足够智能以优化这样的事情......

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533312.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tms320c2000 c语言伪指令,TMS320F240XDSP汇编及C语言多功能控制应用(附光盘)

摘要:本书以SNF2407M实验开发系统配合CPLD的SNDSP2407P接口,以简易的C语言和快速的汇编语言编写达20个以上的范例实验及多个专题制作,主要内容如下:TMS320LF2407系列MCU的硬件架构,内存配置及指令格式和其运作功能;C2000的CC或CCS程序的编辑,编译及除错等操作;DSP搭…

用C语言编写绳索运动函数,福建省教师招聘考试小学数学真题试卷

2014年福建省中小学新任教师公开招聘考试小学数学试卷(课程代码09202)1. 本试卷满分150分,考试时间120分钟。2. 本试卷分为两部分:第一部分为选择题,第二部分为非选择题。3. 请把所有答案涂、写在答题卡上。不要错位、越界答题.一、单项选择题…

c语言 三个小球排排坐,关颖三个孩子排排坐 太萌啦

0关颖三个孩子排排坐 太萌啦2019-12-10 10:596月20日,关颖在微博上晒出三个孩子坐在垫子上的照片,配文:“Terrible two has officially started today. Happy happy birthday Phi Phi! 家庭乐趣其中一件事情 就是和小朋友不断的唱生日歌吹蜡烛…

大学生学C语言用什么笔记本电脑,有哪些适合大学生用的笔记本电脑

高考成绩公布之后又有一大波新大学生即将入学,笔记本电脑也将是大学生必不可少的一款电子数码产品,但是现在市面上电脑繁多,又有哪些比较不错的电脑适合新入学的大学生呢?惠普 HP Envy 13 (2019)现在,最适合学生的笔记…

android自带下拉阻尼动画,android 有阻尼下拉刷新列表的实现方法

本文将会介绍有阻尼下拉刷新列表的实现,先来看看效果预览:这是下拉状态:这是下拉松开手指后listView回滚到刷新状态时的样子:1. 如何调用虽然效果图看起来样子不太好看,主要是因为那个蓝色的背景对不对,没关…

android viewpager画廊,Android使用ViewPager实现画廊效果

按照国际惯例,先上效果图其实这跟普通的ViewPager原理都一样,需要改变的地方就是:1.增加滑进和滑出的动画效果2.缩小ViewPager的大小,给屏幕上留出上一张和下一张视图的空间布局文件:xmlns:android"http://schema…

excel 区间人数柱状图_Excel中,区间统计的3种技巧都不掌握,那就真的OUt了!

点击上方"Excel函数公式"免费订阅 Excel的最大功能在于数据的分析与处理,在数据分析和处理中,区间统计是非常广泛的,各位亲是怎么操作的呢?如果还不掌握,且看小编给大家带来的“区间统计”的3种应用技巧。一…

nova8pro能升级鸿蒙吗,华为将有48款产品可以升级到鸿蒙 2.0系统

网站Huawei Central最近报道称,将有48款产品可以升级到鸿蒙 2.0系统,包括华为及其子品牌Honor的智能手机,平板电脑和智能手表。 Huawei Central名单中有3款未发布的手机Huawei Nova 8和Nova 8 Pro,以及Honor V40。 它们将在推出时…

patran如何看屈曲因子_校准证书中的修正值、修正因子,你真的会用吗?

一些仪器设备校准回来会产生修正值/修正因子,然而很多实验室小伙伴们不懂得如何正确使用这些修正值/修正因子?为帮助广大实验室能规范正确地使用修正值/修正因子,小析姐 特为大家推送这篇文章~【概念】修正值:为修正某一测量器具的…

android 生成debug.keystore,android sdk 如何重新生成debug.keystore

1)首先你要确定你安装的JDK位置,Windows->Preferences->Java->Installed JREs,你可以看到是Jre的location,再在dos cmd模式下查看你当前系统的path是否已经包含了。如果没有包含添加到当前环境参数中。因为我们要用到的keytool命令在这个目录下呀。2)接下来…

已知a类被打包在packagea_2021考研干货:199管理类联考综合逻辑归纳习题(1)

199管理类联考综合中的逻辑,所占分值为60分。因此,备考2021考研199管综的考生们,需要在内容上面多下功夫复习。题目:小张夫妇想买套房子,经他一番挑选,目标锁定某座楼的3套房。已知:这三套房子中…

凯立德手机导航(家园版) v5.3 for android,凯立德手机导航(家园版)android平台

感谢您阅读凯立德手机导航产品下载安装教程,请根据以下步骤进行操作。下载安装过程完成后,您将体验到更为专业的凯立德导航服务。安装前请认真阅读以下文字:1、为了减少导航产品所占容量,本导航产品分主程序和地图数据两部分。下载…

android性能优化 掘金,Android性能优化之内存泄漏

内存泄漏:内存单元使用完成后未释放,未回收。理解强弱引用和gc垃圾回收机制后,会更好的理解内存泄漏问题。在目前的Android项目中,内存泄漏是无法避免的,在编写代码时要是否产生了内存泄漏。内存泄露中要注意对象、变量…

clocks_per_sec 时间不正确_你该拥有的不只是护肤品,还有正确护肤时间表

同样是护肤,为什么你的效果始终不如意?其实,不同的时间段,皮肤各司其职,都有着不同的“任务”和“状态”。快跟芭姐一起了解一下这份《皮肤时间表》,看看如何让护肤效果事半功倍吧!清洁是唤醒肌…

jdbc连接数据scanip_JDBC连接数据库的四种方式:DriverManager,DataSource,DBCP,C3P0

方法1:使用java.sql.DriverManager类驱动管理器类,用于管理所有注册的驱动程序。(注:DataSource 接口是 JDBC 2.0 API 中的新增内容,它提供了连接到数据源的另一种方法。使用 DataSource 对象是连接到数据源的首选方法。)常用的两…

HTML下拉菜单怎么做成横向,css导航条横向带下拉菜单

cssdiv导航下拉二级菜单竖排效果如何改为横排?,在“下一站”有三个二级竖排菜单,如何能变为横排?困扰了我一天了,让二级菜单变成一行,只需要在竖排的效果上,让二级菜单都浮动起来,这…

java移动端接口测试_使用java如何进行接口测试

关于接口测试, 我们之前介绍过很多方法了, 有postman, soapUI, Jmeter等, 他们各有优势和劣势, 今天和大家分享的是如何用java TestNG来实现接口测试.开始测试之前需要如下准备工作:1. IDE环境, Intellij 或者eclipse, 个人推荐使用Intellij.2. JKD1.8 以上3. Maven 环境 Maven…

html5折叠卡片,基于HTML5折叠卡片式下拉菜单代码

基于HTML5折叠卡片式下拉菜单代码。这是一款基于jQueryCSS3HTML5实现的下拉列表框特效代码。效果图如下:实现的代码。hmtl代码:爱编程爱编程 jQuery特效 CSS3特效 HTML5特效 音效下载 flash动画js代码:(function ($) {var cards $(.card-dro…

fastexcel读取excel追加写入sheet页_python笔记52:python操作excel

主要内容:小目标:掌握excel模块主要内容:excel相关模块,openpyxl安装使用如果看完这篇文章,你还是弄不明excel相关操作; 你来找我,我保证不打你,我给你发100的大红包。1. excel相关操…

HTML音乐播放没声音,网页没有声音但系统显示有声音怎么回事?如何解决?

网友提问:为什么网页没有声音,除了迅雷高清在线影院的视频有声音和本已经下载的歌或视频有声音外,其他网页都没有声音!就是网页没声音,其他一切正常!网页没有声音但系统显示有声音;网页在线视频…