看下面的例子
以前一直以为下面这样做比较好,可以重复使用 一个中间变量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、 如果它们新开辟栈执行,那就应该是 第二段代码比较好了,是吧??
求解答、更求参考资料和书籍!!
本着开源的博大精神,分就不多给了。。。
我觉得就你的例子而言最好的是:sum += data->Get(i);
当然了,假设你的temp有很多用途而不得不单独弄个变量,还是定义在for内部比较好,因为这个temp明显是为了某一次循环计算临时值使用的,出了for循环就没用了。对于你的问题1和2,不会开辟新栈。虽然你也认为第二段比较好,但是原因不是因为栈的关系。
我支持你第一种
单从这断代码来说,第一种是明显的好,不用重复申请栈空间。第二种的目的是为了可阅览性,但是这并没有增加可阅览性。
不知道这样对不对..
data->Get(i) 调用Get(...)方法已经返回了一个匿名的本地的中间变量,因此从性能上面来说,两种代码都一样。
如果是直接数据访问 data->data[i] 则从性能上说使用第一种方法要好。。
唉。不懂汇编真蛋疼啊 。。
继续求牛人解答。。。。。。
第1种方法与第二种方法中temp变量都是放在栈中的,从效率上讲,第一种比第二种高效一些。但是这不是最高效的,你定义了1个变量temp,然后将data->Get(i)赋值给temp,再将temp加到sum中,中间引入了变量。如果没有编译器优化的情况下,cpu的操作就是从ram中拿data->Get(i)数据到寄存器,然后将寄存器的值写到内存temp,再从ram中读sum和temp,最后再相加,这增加了cpu的消耗。