加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 我们应该为函数的返回值使用临时变量吗?

发布时间:2020-12-16 06:04:27 所属栏目:百科 来源:网络整理
导读:我想到了:这两种做法有差异吗? 将函数的返回值存储在临时变量中 将该变量作为另一个函数的参数. 将功能放入其他功能. 规范 假设所有类和函数都正确写入. 情况1. ClassA a = function1();ClassB b = function2(a);function3(b); 情况2. function3(function2
我想到了:这两种做法有差异吗?

>将函数的返回值存储在临时变量中
将该变量作为另一个函数的参数.
>将功能放入其他功能.

规范

假设所有类和函数都正确写入.

情况1.

ClassA a = function1();
ClassB b = function2(a);
function3(b);

情况2.

function3(function2(function1()));

我知道只有一个运行没有什么大不同,但是我们可以循环运行很多次,我创建了一些测试.

测试

#include <iostream>
#include <ctime>
#include <math.h>
using namespace std;

int main()
{
   clock_t start = clock();
   clock_t ends = clock();

   // Case 1.
   start = clock();
   for (int i=0; i<10000000; i++)
   {
      double a = cos(1);
      double b = pow(a,2);
      sqrt(b);
   }
   ends = clock();
   cout << (double) (ends - start) / CLOCKS_PER_SEC << endl;

   // Case 2.
   start = clock();
   for (int i=0; i<10000000; i++)
      sqrt(pow(cos(1),2));
   ends = clock();
   cout << (double) (ends - start) / CLOCKS_PER_SEC << endl;
   return 0;
}

结果

>案例1 = 6.375
情况2 = 0.031

为什么第一个比较慢,如果第二个更快,为什么我们总是这样写代码呢?无论如何,第二个pratice有一个名字?
我也想知道如果在第一种情况下在for循环之外创建变量会发生什么,但结果是一样的.为什么?

解决方法

如果您想要计算紧缩和数字变得更加一致,请打破这个全面的优化.确保获得适当值的代码实际上是运行而不是完全抛出的,我已将两个测试中的结果分配给一个易变的本地(这不是完全正确的使用volatile,而是确保只有价值创造是显着的三角洲).
#include <iostream>
#include <ctime>
#include <cmath>
using namespace std;

int main()
{
    clock_t start;
    volatile double val;

    for (int j=1;j<=10;j++)
    {
        // Case 1.
        start = clock();
        for (int i=0; i<2000000; i++)
        {
            double a = cos(1);
            double b = pow(a,2);
            val = sqrt(b);
        }
        cout << j << ':' << (double) (clock() - start) / CLOCKS_PER_SEC << endl;

        // Case 2.
        start = clock();
        for (int i=0; i<2000000; i++)
            val = sqrt(pow(cos(1),2));
        cout << j << ':' << (double) (clock() - start) / CLOCKS_PER_SEC << endl << endl;
    }
    return 0;
}

在我的Macbook Air上生成以下版本编译输出(这是没有任何延伸的速度恶魔):

1:0.001465
1:0.001305

2:0.001292
2:0.001424

3:0.001297
3:0.001351

4:0.001366
4:0.001342

5:0.001196
5:0.001376

6:0.001341
6:0.001303

7:0.001396
7:0.001422

8:0.001429
8:0.001427

9:0.001408
9:0.001398

10:0.001317
10:0.001353

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读