这两种编写代码的方式中哪一种更适合?

时间:2010-10-16 18:35:45

标签: c++ function compiler-construction assembly parameters

我有一个代码,你可以看到我可以用以下两种方式之一编写,问题是唯一的区别是因为在第二个函数中参数被声明为非常量我可以使用它而不是声明一个新的变量(第一个函数中的num1),但我很好奇,如果编译器为每个变量生成的输出汇编代码之间存在任何差异,哪一个更适合:

void Test(const long double input){
 long double num=(6.0*input);
 long double num1=9.0;
 for (int i=0;i<5;i++)
  num1*=num;
 cout <<num1<<'\n';
}

void Test(long double input){
 long double num=(6.0*input);
 input=9.0;
 for (int i=0;i<5;i++)
  input*=num;
 cout <<input<<'\n';
}

5 个答案:

答案 0 :(得分:3)

一个好的优化编译器理论上可以通过注册到数字的浮点寄存器来使它们等效(即,为两者生成等效代码),尽管这可能不会产生最快的代码。这样的编译器是否存在是一个很好的问题。

虽然因为风格(即可读性)的原因,我更喜欢第一种,因此同一个变量不会用于两个不同的事情:

void Test(const long double input){ 
 long double num=(6.0*input); 
 long double num1=9.0; 
 for (int i=0;i<5;i++) 
  num1*=num; 
 cout <<num1<<'\n'; 
}

答案 1 :(得分:2)

像这样:

void Test(long double input)
{
    long double factor = 6.0 * input;
    long double result = 9.0;

    for (int i = 0; i < 5; ++i)
        result *= factor;

    cout << result << '\n';
}

请注意,我们在两者之间放置空格的原因与weputspaces之间存在相同的原因,并给出了有意义的名称,因此它实际上是可读的......

答案 2 :(得分:1)

编译器生成的内容完全取决于您的编译器标志和平台。使用完全优化(仅给出它们的差异函数名称)生成上述每个的汇编器输出将是一个有趣的练习,并在此处发布以获得明确的评论,或作为单独的问题)。

我的猜测是你很可能会关注性能 - 如果是这样的话,我会写一个小的包装应用程序来调用每个函数N次,然后输出相对时间,可能会排除cout部分以避免控制台I / O扭曲结果。

答案 3 :(得分:1)

像这样:

void Test(long double input)
{
    long double const factor = 6.0 * input;
    long double       result = 9.0 * pow(factor, 5);

    cout << result << '\n';
}

如果你必须使用循环,那么我会遵循GMan的例子。

一个用途的一个变量。试图重用变量没有任何意义。编译器甚至没有变量名的概念。它在适当时重新使用插槽(注意我使用术语插槽:多个变量可以使用相同的插槽)。

编译器在优化方面比人类好得多,尝试击败它会产生反作用(使用更好的算法,因为编译器不理解算法,因此人为因素)。

关于代码最重要的事情不是写它而是维护它。因此,您的代码必须被编写为易于为下一个人维护(公司将在维护上花费更多,然后开发新代码)。古老的谚语是编写你的代码,知道维护者是一个斧头谋杀者,知道你住在哪里。

答案 4 :(得分:0)

在第二个函数中,您正在重用参数中的堆栈空间,而在第一个函数中,编译器必须为num1保留空间。除了使用的地址/偏移外,汇编指令应该相同。