- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C程序设计语言-学习笔记
函数调用开销对于没有参数函数调用的开销:1. 调用函数和返回,所以需要执行一次call/ret指令对。2. 函数内部,需要保护现场,所以需要把%ebp push到栈中,返回前,再pop出来。3. 构造函数运行环境,将%ebp赋值为当前的栈顶%esp。则没有参数函数调用开销是5个指令。相比于没有参数函数调用的开销,带参数函数调用多2个指令,用于传递参数:movl -4(%ebp), %eaxmovl %eax, (%ebp)每个参数的传递时都需要2个指令。而如果是指针参数,则函数在使用时,还得需要2个指令。这么看,函数调用的开销还挺大的。所以,当一个函数很小且调用频繁时,应该用宏或内联函数进行替代。?另外,虽然函数调用有开销,但除非有特殊的必要,该用函数的地方还是应该使用函数,否则会严重降低代码的可读性和可维护性。-------------------------------------------------------------------------------对于特别小的函数,编译器可能会将其编译为内联函数(将函数体直接展开),但对于普通的函数,函数调用函数有一些开销的。但是这个开销非常小,可以忽略不计。下面分析一下函数调用的开销。1。函数调用至少执行一次call指令和ret指令。2。如果函数中使用了局部变量或者函数带有参数,编译器会生成方便访问调用参数和局部变量的参数(以VC6.0为例,在函数开头会修改ebp寄存器,在函数尾部会恢复ebp寄存器。3。如果函数中用到esi,edi,ebx,编译器会函数开头放置保护寄存器的指令,在函数尾部放置恢复寄存器的指令。4.如果一个函数时间复杂度非常小,且调用非常频繁,在C++中建议用inline函数,在C中建议用macro,除此以外,建议能用函数的地方,尽量定义函数。而不要大量的代码塞在一个函数中,这样既难阅读,又难维护。函数调用是有开销的:参数传递、保护现场,这些都需要CPU时间。但对于楼主的测试,由于函数代码较短,编译器很容易将它内联,于是变成没有开销了。当然,即使是要追求效率,把所有的代码全部写在main函数中也不是什么好办法。个人认为一个C语言的函数,代码不应该超过100行,每行(包括空格和缩进)不超过80个字符。过长的函数会为调试和阅读带来极大的不便。另外,应该分析函数调用的开销在整个程序中所占据的比例。除非这个比例到了用户不能容忍的程度,否则就没必要去把多个小函数揉成一个巨大的函数。函数、宏、内联函数1、函数调用函数的开销大致可分两个部分:传递参数的开销和保存当前程序上下文信息所花费的开销。对于传递参数的开销而言,传递的参数越多开销就越大;对于保存当前程序上下文所花费的开销而言,函数越复杂需要花费的开销就越大。2、宏宏在某种程度上可以代替函数,避免函数调用带来的开销。定义完宏之后,在编译程序时,用替代字符串代替程序中的宏。对于宏而言,虽然避免了函数调用带来的开销,但是增加了内存的开销。因为在每个应用宏的地方宏都会展开。????另外,宏易读性比较差,容易出现问题。例如:#define MAX(a,b) ((a) (b) ? (b):(a))void main(){????????int a = 10;????????int b = 11;????????int c = 0;????????c = MAX(a++,b++);????????cout c endl;????????cin c;}????我们会发现c的结果为12,因为宏展开之后变为:((a++) (b++) ? (b++) : (a++))并不是我们预想中的结果。故一般来讲最好不使用宏。3、内联函数????内联函数是避免函数调用开销的另一种方法,与宏类似,在程序编译是用内联函数替换函数调用。但只能运用与C++中,C中无法使用。与宏相比拥有参数类型检查的优点。????在C++类中,对于设置和读取私有变量的函数设置为内敛函数,有助于提高函数的效率。内敛函数的实现有两种方式,第一种是在函数定义时使用关键字inline,第二种方式时在函数定义时与函数体一起定义。4、递归与迭代????递归可以使程序显得短小精悍,然而由于函数的多层调用,会严重影响程序的运行效率和内存使用效率。幸运的是在某种情况下,我们可以使用迭代来代替递归,避免函数调用开销。例子:递归版计算n的阶乘long Factorial(int n){????????if(n == 0)????????{????????????????return 1;????????}????????else????????{????????????????return Factorial(n-1);????????}}迭代版计算n的阶乘long Factorial
您可能关注的文档
最近下载
- 5.2 诚实守信(教学设计) 2025-2026学年八年级道德与法治上册 统编版.docx VIP
- S系列-STARFISH-SYK SYM智能型电动执行机构使用说明书(V1.80)(外发).pdf VIP
- 2019年中级标准化工程师专业技术职称完整考试题库500题(含参考答案).pdf VIP
- 银行信贷业务中担保方式调查.ppt VIP
- 马哲演讲矛盾的同一性和斗争性课件.pptx VIP
- 标准化工程师考试题库.docx VIP
- 《矛盾分析法复习》课件.ppt VIP
- 矛盾分析法课件.ppt VIP
- 打造“四有”体育课堂-发展学生核心素养.docx VIP
- 心肺复苏及电除颤课件.ppt VIP
文档评论(0)