转载请注明来源 http://blog.csdn.net/imred/article/details/48865359
初学C语言的时候,我们有时会听说函数调用会有一定的开销,在进行了进一步学习之后,我们来看看原来听说的开销指的什么。
下面是两个非常简单的样例,就不作解释了:
函数调用版本C程序:

#include <stdio.h>

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;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

使用gcc汇编后:

    .file   "function.c".text.globl  _sum.def    _sum;   .scl    2;  .type   32; .endef
_sum:pushl   %ebpmovl    %esp, %ebpmovl    12(%ebp), %eaxmovl    8(%ebp), %edxaddl    %edx, %eaxpopl    %ebpret.def    ___main;    .scl    2;  .type   32; .endef.globl  _main.def    _main;  .scl    2;  .type   32; .endef
_main:pushl   %ebpmovl    %esp, %ebpandl    $-16, %espsubl    $32, %espcall    ___mainmovl    $1, 28(%esp)movl    $1, 24(%esp)movl    24(%esp), %eaxmovl    %eax, 4(%esp)movl    28(%esp), %eaxmovl    %eax, (%esp)call    _summovl    %eax, 20(%esp)movl    $0, %eaxleaveret
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

无函数调用版本c程序:

#include <stdio.h>

int main()
{
int a = 1;
int b = 1;
int c;
c = a + b;
return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

使用gcc汇编后:

    .file   "no_function.c".def    ___main;    .scl    2;  .type   32; .endef.text.globl  _main.def    _main;  .scl    2;  .type   32; .endef
_main:pushl   %ebpmovl    %esp, %ebpandl    $-16, %espsubl    $16, %espcall    ___mainmovl    $1, 12(%esp)movl    $1, 8(%esp)movl    8(%esp), %eaxmovl    12(%esp), %edxaddl    %edx, %eaxmovl    %eax, 4(%esp)movl    $0, %eaxleaveret
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

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

1

    movl    24(%esp), %eaxmovl    %eax, 4(%esp)movl    28(%esp), %eaxmovl    %eax, (%esp)
  • 1
  • 2
  • 3
  • 4

2

    call    _sum
  • 1

3

    pushl   %ebpmovl    %esp, %ebp
  • 1
  • 2

4

    popl    %ebpret
  • 1
  • 2

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

1

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

2

将控制权转移至函数中

3

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

4

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

C语言: 函数调用的开销相关推荐

  1. C语言函数调用栈(一)

    以下全文转载自:C语言函数调用栈(一) 程序的执行过程可看作连续的函数调用.当一个函数执行完毕时,程序要回到调用指令的下一条指令(紧接call指令)处继续执行.函数调用过程通常使用堆栈实现,每个用户态 ...

  2. C语言函数调用的原理

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105088660 C ...

  3. c语言函数调用参数调用的太少,浅谈C语言函数调用参数压栈的相关问题

    参数入栈的顺序 以前在面试中被人问到这样的问题,函数调用的时候,参数入栈的顺序是从左向右,还是从右向左.参数的入栈顺序主要看调用方式,一般来说,__cdecl 和__stdcall 都是参数从右到左入 ...

  4. C语言C6292错误,测试c语言函数调用性能因素

    标签: 函数调用:即调用函数调用被调用函数,调用函数压栈,被调用函数执行,调用函数出栈,调用函数继续执行的一个看似简单的过程,系统底层却做了大量操作. 操作: 1,               调用函 ...

  5. c语言函数参数压栈,函数调用压栈 浅谈C语言函数调用参数压栈的相关问题

    想了解浅谈C语言函数调用参数压栈的相关问题的相关内容吗,在本文为您仔细讲解函数调用压栈的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:函数调用压栈,下面大家一起来学习吧. 参数入栈的顺序 ...

  6. c语言中staloc是什么意思,C语言函数调用栈(三)

    6 调用栈实例分析 本节通过代码实例分析函数调用过程中栈帧的布局.形成和消亡. 6.1 栈帧的布局 示例代码如下: //StackReg.c #include //获取函数运行时寄存器%ebp和%es ...

  7. 参数在c语言中,C语言函数调用和参数传递

    C语言函数被定义以后可以被多次调用,调用的时候可以向它传递参数. C语言函数调用 函数的调用指的就是函数的使用方法. 在程序中使用已经定义的函数,可以使用函数调用表达式,其一般格式如下: 函数名(实参 ...

  8. 采用汇编语言对c语言函数调用的方法求平均数 汇编实验报告,汇编语言调用c语言完成求平均值.docx...

    汇编语言调用c语言完成求平均值.docx <汇编语言程序设计>实验报告系别专业年级学号姓名2012年6月实验七汇编语言对C语言函数调用求平均值一.实验目的本实验主要达到以下目的:1.完成汇 ...

  9. C语言函数调用时候内存中栈的动态变化详细分析

    先了解如下几点知识和过程: * 冯诺伊曼体系计算机程序指令代码都是提前从硬盘加载进入内存从而执行的(如果是哈佛体系结构的计算机指令代码是直接在外存里面执行的,具体可以看我这篇文章,计算机冯诺伊曼体系结 ...

最新文章

  1. oracle添加语句 commit,Oracle COMMIT语句
  2. 大转盘完整源码附效果图,可以下载直接用
  3. 6个能写进简历的AI项目,有点难,一起来挑战?
  4. jQuery 一次定时器_年薪百万之路--第五十一天 jQuery(上)
  5. 亚马逊向土耳其企业启动“全球开店”计划,要和中国卖家抢夺欧洲市场
  6. 【线上分享】沉浸式视频传输
  7. 机器学习相关知识 大佬博客整理
  8. 【HDU - 5605】 geometry(水,数学题,推公式)
  9. 赠书 | SkyWalking 观测 Service Mesh 技术大公开
  10. JS 判断输入是否为数字
  11. WORD如何缩小编号与文本之间的距离?
  12. Linux管理员手册
  13. 实对称矩阵的特征值求法_实对称矩阵、相似、标准型、合同的逻辑网
  14. 用python做爬虫看图软件-RandomPicture
  15. MIUI12系统怎么样开启Root超级权限的流程
  16. 雅虎微软交易局中局:巴茨开始绝望主妇式攻击
  17. Android drawable微技巧,你所不知道的drawable的那些细节
  18. 人类与计算机作文1500,人类群星闪耀时作文1500字
  19. 设备无法使用、驱动载入异常(39){无法取得路径} 路径 %hs 不存在
  20. ppt制作的一些要点

热门文章

  1. java field, property,variable及getField和getDeclaredField的区别
  2. Levenshtein Distance算法(编辑距离算法)
  3. iOS开发之时间格式的转化
  4. http://4526621.blog.51cto.com/4516621/1343369
  5. 关于Dictionary字典和List列表
  6. http请求在asp.net中的应用
  7. C++ 是一门难学易用的语言!
  8. PHP实现递归的三种方法
  9. 2修改字段名_DevExpress ASP.NET v18.2新功能详解(二)
  10. 随笔:写给我深爱的球队