C语言 time函数 开销,C语言: 函数调用的开销

初学C语言的时候,我们有时会听说函数调用会有一定的开销,在进行了进一步学习之后,我们来看看原来听说的开销指的什么。

下面是两个非常简单的样例,就不作解释了:

函数调用版本C程序:

#include

int sum(int a, int b)

{

return a + b;

}

int main()

{

int a = 1;

int b = 1;

int c;

c = sum(a, b);

return 0;

}

使用gcc汇编后:

.file "function.c"

.text

.globl _sum

.def _sum; .scl 2; .type 32; .endef

_sum:

pushl %ebp

movl %esp, %ebp

movl 12(%ebp), %eax

movl 8(%ebp), %edx

addl %edx, %eax

popl %ebp

ret

.def ___main; .scl 2; .type 32; .endef

.globl _main

.def _main; .scl 2; .type 32; .endef

_main:

pushl %ebp

movl %esp, %ebp

andl $-16, %esp

subl $32, %esp

call ___main

movl $1, 28(%esp)

movl $1, 24(%esp)

movl 24(%esp), %eax

movl %eax, 4(%esp)

movl 28(%esp), %eax

movl %eax, (%esp)

call _sum

movl %eax, 20(%esp)

movl $0, %eax

leave

ret

无函数调用版本c程序:

#include

int main()

{

int a = 1;

int b = 1;

int c;

c = a + b;

return 0;

}

使用gcc汇编后:

.file "no_function.c"

.def ___main; .scl 2; .type 32; .endef

.text

.globl _main

.def _main; .scl 2; .type 32; .endef

_main:

pushl %ebp

movl %esp, %ebp

andl $-16, %esp

subl $16, %esp

call ___main

movl $1, 12(%esp)

movl $1, 8(%esp)

movl 8(%esp), %eax

movl 12(%esp), %edx

addl %edx, %eax

movl %eax, 4(%esp)

movl $0, %eax

leave

ret

除了公共部分和指导信息之外,第一个汇编程序比第二个汇编程序多了以下内容:

1

movl 24(%esp), %eax

movl %eax, 4(%esp)

movl 28(%esp), %eax

movl %eax, (%esp)

2

call _sum

3

pushl %ebp

movl %esp, %ebp

4

popl %ebp

ret

额外的开销就体现在这4段代码上了,我来一一解释一下它们的作用:

1

参数入栈代码,将函数参数入栈,这是现在函数调用的标准方式。参数越多,开销越大

2

将控制权转移至函数中

3

建立新的栈帧,也就是当前函数使用的“一片”栈空间,使用ebp的值来标识新的栈帧,因此要将原栈帧首地址保存下来,方便回到原来的即调用者的栈帧

4

恢复原栈帧,然后将控制权转移至调用者 从汇编的角度来看,这额外的开销就是指的这不足十行的指令了,会对性能有多大影响呢?大概有那么一丁点。当然,对于不同的函数,以及不同的调用频率,这个影响也不尽相同。当然,这个程序是一个极端,它函数的功能代码也只有3行,这样的情况完全可以不用函数或者使用内联函数。所以是使用函数还是不使用函数呢?依我来看,为了程序的可读性,我们还是牺牲那么一丁点的性能吧。

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

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

相关文章

机器学习萌新必学的Top10算法

导读:在机器学习领域里,不存在一种万能的算法可以完美解决所有问题,尤其是像预测建模的监督学习里。所以,针对你要解决的问题,最好是尝试多种不同的算法。并借一个测试集来评估不同算法之间的表现,最后选出…

NET问答: C# 中有哪些 HttpPost 工具包

咨询区 Hooch:我会用 GET Request,但如何使用 Post Request 还得请教大家。回答区 Evan Mulawski:有多种方式可以使用 Http 的 GET 和 Post 请求。A方法:HttpClient (推荐)HttpClient 可用于 .NET Framework 4.5, .NET Standard 1…

wordpress安装 相关

64 位ubuntu 安装 32位兼容包apt-get install ia32-libs刚看了一下,wordpress才11个表太神奇了,这么复杂的系统,amazing参考以下文章http://9hills.us/2011/01/wordpress/http://dueam.org/2010/09/ubuntu-server-%E5%AE%89%E8%A3%85%E4%B8%8…

分支结构程序案例c语言,C语言学习之三——分支结构程序

运算符优先级:如下所示:image.png关系运算符和表达式关系运算符定义:在程序中经常需要比较两个量的大小关系,以决定程序下一步的工作。因此使用关系运算符进行比较(注:比较后的返回值为boolean值,即0或1(真为1&#xf…

老刘在微软Ignite China大会上聊低代码

观点概要1.低代码平台不是新概念,这种概念的上一个类似的提法是“所见即所得”。目前的低代码平台是依靠技术手段,不仅让所见即所得,还可以让一部分“所不见也所得”,比如背后的数据结构,业务逻辑,权限认证…

诺基亚首款Windows Phone智能手机将在年内推出

诺基亚高级官员星期日称,第一款采用微软Windows Phone操作系统的诺基亚智能手机的目标发布日期将在几天之内确定下来。诺基亚的目标是在将这种手机推向市场。诺基亚负责智能设备的执行副总裁乔哈洛(Jo Harlow)称,诺基亚和微软的技…

c语言四个数找大wxyz,2015年计算机二级《C语言》考试上机测试题(7)

31.有以下程序:#includemain(  ){char a[20],b[20],c[20];scanf("%s%s",a,b);gets(c);printf("%S%S%s\n",a,b,c);}程序运行时从第一列开始输入:Th…

IOT必备之MQTT结构分析,不进来看看?【后附源码】

全网唯一物联网MQTT协议报文结构分析以及基于C#代码的报文组装实现介绍MQTT是一种基于TCP/IP协议的应用层协议,它规定了不同应用之间进行数据交换时的传送格式。既然是协议,理论上可以被任何开发语言实现它,以运行在任何平台,这个…

要成为年薪五十万的数据分析师,除了技术还需要什么?

超过59%企业,将提高数据分析岗位数量----一流的数据分析师,年薪轻松突破50万想必同学们看到这个数据并不惊讶,如今在中国,各行各业对数据分析岗位的需求日益提高:在线社交媒体,希望通过数据时刻洞察用户关注…

ISAPI_Rewrite伪静态配置

第一:首先我们需要下载一个ISAPI_Rewrite,有精简版和完全版,一般精简版只能对服务器全局进行配置,而完整版可以对服务器上的各个网站进行伪静态配置.对于个人站长来说,精简版就足够了. 下载:http://www.isapirewrite.com/download/isapi_rwl_0055.msi 第二:下载完…

c语言电脑蓝屏代码,电脑蓝屏代码0x0000001a的解决方法

遇到蓝屏,第一时间记录停机码,如有导致蓝屏的文件名,那么排查的范围就会缩小。下面小编就为大家介绍电脑蓝屏代码0x0000001a的解决方法介绍,希望能对大家有所帮助!方法/步骤1、先看这张截图的停机码所在位置。STOP后面…

关于序列建模,是时候抛弃RNN和LSTM了

作者表示:我们已经陷入 RNN、LSTM 和它们变体的坑中很多年,是时候抛弃它们了!在 2014 年,RNN 和 LSTM 起死回生。我们都读过 Colah 的博客《Understanding LSTM Networks》和 Karpathy 的对 RNN 的颂歌《The Unreasonable Effecti…

如何运用并行编程Parallel提升任务执行效率

本文来自小易,【DoTNET技术圈】公众号已获得转载授权。《.NET并发变成实战》读后感:并行编程Parallel手打目录:一、前言二、任务并行库(TPL)的介绍三、Parallel.Invoke的使用四、Parallel.For的使用五、Parallel.ForEa…

VMware View 与Citrix XenDesktop对决之用户体验篇

看看真实的VMware View 与Citrix XenDesktop对比。 用户体验作为虚拟桌面成功的关键因素,看看VMware View如何在这方面立于不败之地。 对于测试中暴露的差异,您也许会觉得困惑。其实当您了解完下面这些,就全明白了。 Citrix的XenDesktop使用的…

c语言整数四则运算表达式的输出格式控制,Educoder CC++基本输入输出

第1关:重要的事情说三遍1.这里结合的一个具体场景是:程序接受一个输入字符,然后将该字符输出三遍,再输出一个!。// 包含标准输入输出函数库#include // 定义main函数int main(){// 请在此添加‘重要的事情说三遍’的代…

通过 GitHub Actions 自动创建 Github Release

通过 GitHub Actions 自动创建 Github ReleaseIntro在 GitHub 上维护了几个小的开源项目,每次在发布新版本的时候会创建一个 release,这样可以比较方便的找到对应的版本的代码,不需要再人肉的从 git log 中找到指定的 commit,而且…

利用win7的applocker功能来有组织的阻止相关软件运行

我有4年没用360相关的软件了,没有360的弹窗用电脑就是舒服。但是我的电脑有时候会有别人来用,我的同学或者我的父母。但是他们经常会自作主张地在我的电脑上装上360卫士,还有360浏览器。每次都是装了我再删,反反复复也不是办法。后…

人工智能会让工作环境变得更公平,还是更压抑?

人工智改变的不仅仅是工作内容……人工智能(AI)正在踏足商业领域。正如我们本周的特别报道所诠释到的那样,所有类型的公司都在利用人工智能来预测需求,雇佣员工和对付客户。2017年,企业在与人工智能相关的并购交易中支…

递归C语言排列组合方式,递归解决一种排列组合的方法

问题场景:比如说一件商品有3中属性,每个属性又有3种不同的值,那么此时问,这几种属性可能的组合性,相信你很快就得到结果为"33327"种,此时你可以实现的方式可以为三个for循环嵌套来实现&#xff0…

windows服务autofac注入quartz任务

概述Autofac 是一款超赞的.NET IoC 容器 . 它管理类之间的依赖关系, 从而使 应用在规模及复杂性增长的情况下依然可以轻易地修改 . 它的实现方式是将常规的.net类当做 组件 处理。我们通常在一些情况下需要软件具有一个自动执行某些任务的功能,但是又不希望直接启动…