网站建设的进度,网站建设指引,公司服务器租用,没有备案的网站怎么挂广告初学C语言的时候#xff0c;我们有时会听说函数调用会有一定的开销#xff0c;在进行了进一步学习之后#xff0c;我们来看看原来听说的开销指的什么。下面是两个非常简单的样例#xff0c;就不作解释了#xff1a;函数调用版本C程序#xff1a;#include int sum(int a, …初学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 %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无函数调用版本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 %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除了公共部分和指导信息之外第一个汇编程序比第二个汇编程序多了以下内容1movl 24(%esp), %eaxmovl %eax, 4(%esp)movl 28(%esp), %eaxmovl %eax, (%esp)2call _sum3pushl %ebpmovl %esp, %ebp4popl %ebpret额外的开销就体现在这4段代码上了我来一一解释一下它们的作用1参数入栈代码将函数参数入栈这是现在函数调用的标准方式。参数越多开销越大2将控制权转移至函数中3建立新的栈帧也就是当前函数使用的“一片”栈空间使用ebp的值来标识新的栈帧因此要将原栈帧首地址保存下来方便回到原来的即调用者的栈帧4恢复原栈帧然后将控制权转移至调用者 从汇编的角度来看这额外的开销就是指的这不足十行的指令了会对性能有多大影响呢大概有那么一丁点。当然对于不同的函数以及不同的调用频率这个影响也不尽相同。当然这个程序是一个极端它函数的功能代码也只有3行这样的情况完全可以不用函数或者使用内联函数。所以是使用函数还是不使用函数呢依我来看为了程序的可读性我们还是牺牲那么一丁点的性能吧。