[技术| 编程·课件·Linux] 向广大同学征集学习编程、算法过程中的问题与疑惑
西风破
· 发布于 2012-10-31 00:12
· 1353 次阅读
转载文章时务必注明原作者及原始链接,并注明「发表于 软院网 RuanYuan.Net 」,并不得对作品进行修改。
我写了4个程序来计算阶乘fac(n),一个用宏,编译器为了防止无限制递归展开(我估计余老师说的是这种情况,VS看样子是禁止了),语法规定,当一个宏遇到自己时,就停止展开,所以我没办法把宏写成递归形式,写成了for循环,个人感觉和在主程序中写个for是一样的效果,后面也证实了这一点,第二个主程序中用for,第三个用普通函数调用,第四个个用内联函数调用,结果是内联函数和普通函数调用在生成目标代码obj大小和运行时间上几乎无差别,这里需注意一点,内联是编译器来决定是否展开的,当遇到循环,switch等时,编译器不会展开,一样会调用函数,所以说短小精悍的代码适合用内联函数写,写成宏的fac(n)生成代码和运行时间均小于以上两种,和主程序写for几乎无差别,说明它是直接替换了,没有压栈等操作,所以快于前两者,以上纯属个人分析,本人对汇编代码一窍不通,欢迎同学们板砖。最近好忙,好怕挂挂额,争取保持自己的不挂金身 |
因为宏替换仅仅在预编译阶段的代码调换。内联函数还涉及了编程软件的优化,我们都知道编译软件会优化递归函数,可能转换成迭代或其他的(具体可参照实用算法第2次还是第3次作业那个计算递归时间的那次作业)。所以相对来说内联函数会提高效率。 本人跨专业菜鸟,语言不精确地方请指正。 |