西风破 发表于 2012-10-31 00:12:31

向广大同学征集学习编程、算法过程中的问题与疑惑

来软件学院有两个月了,有不少同学本科对算法和编程接触甚少,在软院较重的学习压力下比较吃力。
所以面向所以同学征集学习过程中一些问题,(问题无论巨细,可以是很具体的,也可以很精炼)
本人虽不是大牛,但会会力求给大家一些解答。
实用算法的余老师可能会让我在下周统一给大家一点解答。
欢迎非信息专业的同学不耻下问,
恳请计算机专业的同学多多指点。
不知道发这个板块对不对。谢谢大家了。

hslx111 发表于 2012-10-31 00:55:48

帮顶一下,加油~

390125133 发表于 2012-10-31 08:08:59

这么高调,不符合你的风格啊,可能余老师听了我对你的介绍(我说你低调腼腆,极其细致),有意让你做一次新的尝试,我开个头吧,请问C++的string对象如何向Char*转换?

vividly 发表于 2012-10-31 08:56:01

为什么递归调用中用宏定义代替函数或者用内联函数反而会降低效率?

X1n4n 发表于 2012-10-31 10:06:50

vividly 发表于 2012-10-31 08:56 static/image/common/back.gif
为什么递归调用中用宏定义代替函数或者用内联函数反而会降低效率?

{:5_150:}我怎么觉得没有降低效率呢。。。为什么会降低效率啊?。。

390125133 发表于 2012-10-31 18:37:33

我写了4个程序来计算阶乘fac(n),一个用宏,编译器为了防止无限制递归展开(我估计余老师说的是这种情况,VS看样子是禁止了),语法规定,当一个宏遇到自己时,就停止展开,所以我没办法把宏写成递归形式,写成了for循环,个人感觉和在主程序中写个for是一样的效果,后面也证实了这一点,第二个主程序中用for,第三个用普通函数调用,第四个个用内联函数调用,结果是内联函数和普通函数调用在生成目标代码obj大小和运行时间上几乎无差别,这里需注意一点,内联是编译器来决定是否展开的,当遇到循环,switch等时,编译器不会展开,一样会调用函数,所以说短小精悍的代码适合用内联函数写,写成宏的fac(n)生成代码和运行时间均小于以上两种,和主程序写for几乎无差别,说明它是直接替换了,没有压栈等操作,所以快于前两者,以上纯属个人分析,本人对汇编代码一窍不通,欢迎同学们板砖。最近好忙,好怕挂挂额,争取保持自己的不挂金身

tom1990 发表于 2012-10-31 19:38:58

vividly 发表于 2012-10-31 08:56 static/image/common/back.gif
为什么递归调用中用宏定义代替函数或者用内联函数反而会降低效率?

因为宏替换仅仅在预编译阶段的代码调换。内联函数还涉及了编程软件的优化,我们都知道编译软件会优化递归函数,可能转换成迭代或其他的(具体可参照实用算法第2次还是第3次作业那个计算递归时间的那次作业)。所以相对来说内联函数会提高效率。

本人跨专业菜鸟,语言不精确地方请指正。

西风破 发表于 2012-10-31 23:35:06

tom1990 发表于 2012-10-31 19:38 static/image/common/back.gif
因为宏替换仅仅在预编译阶段的代码调换。内联函数还涉及了编程软件的优化,我们都知道编译软件会优化递归 ...

你好。我不知道怎么拿宏替换写递归,编译无错,反复不能链接。
递归用宏定义代替,我觉得行不通。因为宏定义只是简单的替换,而递归根据输入n的大小会在执行的时候形成大小不一的递归栈。如果用宏定义,需要把每种情况都定义出来,但那已经不算得是递归了吧。
我没使用过内联函数。不敢妄自评论
页: [1]
查看完整版本: 向广大同学征集学习编程、算法过程中的问题与疑惑