我有一个代码,正如你所看到的,我可以用以下两种方式之一编写,问题是唯一的区别是因为在第二个函数中参数被声明为非常量我可以使用它而不是声明一个新的变量(第一个函数中的 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';
}
一个好的优化编译器理论上可以通过注册到数字的浮点寄存器中使它们等效(即为两者生成等效的代码),尽管这可能不会产生最快的代码。这样的编译器是否存在是一个很好的问题。
出于风格(即可读性)的原因,我更喜欢第一个,这样同一个变量就不会用于两个不同的事情:
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 factor = 6.0 * input;
long double result = 9.0;
for (int i = 0; i < 5; ++i)
result *= factor;
cout << result << '\n';
}
请注意,我们在事物之间放置空格的原因与我们在单词之间放置空格并赋予事物有意义的名称相同,因此它实际上是可读的......
像这样:
void Test(long double input)
{
long double const factor = 6.0 * input;
long double result = 9.0 * pow(factor, 5);
cout << result << '\n';
}
如果您必须使用循环,那么我会遵循 GMan 的示例。
一变量一用。尝试重用变量是没有意义的。编译器甚至没有变量名的概念。它在适当的时候重新使用槽(注意我使用术语“槽”:多个变量可以使用同一个槽)。
编译器在优化方面比人类好得多,以至于尝试击败它会适得其反(使用更好的算法,这是因为编译器不理解算法而出现人为因素)。
代码最重要的不是编写它而是维护它。因此,您的代码必须编写得易于他人维护(公司在维护上花费的钱比开发新代码要多得多)。古老的格言是,编写代码时要知道维护者是一个知道你住在哪里的斧头杀手。
编译器生成的内容完全取决于您的编译器标志和平台。 使用完全优化(只需给它们提供 diff 函数名称)为上述每个生成汇编器输出并将其发布到此处以获取明确的评论或作为单独的问题)将是一个有趣的练习。
我的猜测是,您最有可能关心性能 - 如果是这样,我只需编写一个小包装应用程序来调用每个函数 N 次,然后输出相对时序,可能排除
cout
部分以避免控制台 I/O扭曲结果。
在第二个函数中,您将重用参数中的堆栈空间,而在第一个函数中,编译器必须为
num1
保留空间。除了使用的地址/偏移量之外,汇编指令应该是相同的。