首页 新闻 会员 周边 捐助

关于if、for、while。。

0
悬赏园豆:5 [待解决问题]

看下面的例子

 

以前一直以为下面这样做比较好,可以重复使用 一个中间变量temp。

float average(DATA* data,int count)
{
   int sum = 0;
   int temp = 0;  
   for (int i = 0;  i<count; ++i)
   {
        temp = data->Get(i);
        sum +=temp;  
   }
   return count>0?(float)sum/count : FLT_MIN;
}

但是今天同事说这样更好:

float average(DATA* data,int count)
{
   int sum = 0;
 
   for (int i = 0;  i<count; ++i)
   {
        int temp = data->Get(i); //放在for循环中。
        sum +=temp;    //这两句语句 等于 sum += data->Get(i) 对吧??。
   }
   return count>0?(float)sum/count : FLT_MIN;
}

因此问题来了:

1、for、if、while中的代码是像函数一样要中断吗,也就是说要另外在一个栈中执行??

2、 如果它们新开辟栈执行,那就应该是 第二段代码比较好了,是吧??

 

求解答、更求参考资料和书籍!!

 

本着开源的博大精神,分就不多给了。。。

c
小明哥哥的主页 小明哥哥 | 初学一级 | 园豆:186
提问于:2013-04-24 15:34
< >
分享
所有回答(5)
0

我觉得就你的例子而言最好的是:sum += data->Get(i);

当然了,假设你的temp有很多用途而不得不单独弄个变量,还是定义在for内部比较好,因为这个temp明显是为了某一次循环计算临时值使用的,出了for循环就没用了。对于你的问题1和2,不会开辟新栈。虽然你也认为第二段比较好,但是原因不是因为栈的关系。

水牛刀刀 | 园豆:6350 (大侠五级) | 2013-04-24 15:49
0

我支持你第一种 

互联网Fans | 园豆:344 (菜鸟二级) | 2013-04-24 17:17
0

单从这断代码来说,第一种是明显的好,不用重复申请栈空间。第二种的目的是为了可阅览性,但是这并没有增加可阅览性。

呆呆蚁 | 园豆:231 (菜鸟二级) | 2013-04-24 18:41
0

不知道这样对不对..

data->Get(i) 调用Get(...)方法已经返回了一个匿名的本地的中间变量,因此从性能上面来说,两种代码都一样。

如果是直接数据访问 data->data[i] 则从性能上说使用第一种方法要好。。

 

唉。不懂汇编真蛋疼啊 。。

继续求牛人解答。。。。。。

小明哥哥 | 园豆:186 (初学一级) | 2013-04-24 20:16
0

第1种方法与第二种方法中temp变量都是放在栈中的,从效率上讲,第一种比第二种高效一些。但是这不是最高效的,你定义了1个变量temp,然后将data->Get(i)赋值给temp,再将temp加到sum中,中间引入了变量。如果没有编译器优化的情况下,cpu的操作就是从ram中拿data->Get(i)数据到寄存器,然后将寄存器的值写到内存temp,再从ram中读sum和temp,最后再相加,这增加了cpu的消耗。

(︶O︶) | 园豆:202 (菜鸟二级) | 2018-09-06 17:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册