2010-10-16 85 views
-1

我已经得到了一个代码,你可以看到我可以用以下两种方式之一编写,唯一的区别是,因为在第二个函数中,参数被声明为非常量,我可以用它来代替声明一个新的变量(在第一功能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'; 
} 
+0

很可能您的编译器有一个开关将汇编代码保留在文件中,可能带有.s扩展名。这是避免繁琐测试以确定两个实现是否真的等价的好方法:如果程序集是相同的,它们就是。 – 2010-10-16 18:42:00

+0

为什么不生成程序集并查看!除非您完全告诉我们您的设置,否则只有您可以回答这些问题之一。 – 2010-10-16 20:00:14

回答

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的例子。

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

编译器在优化方面比人类好得多,它试图打败它(使用更好的算法,这是因为编译器不理解算法而产生的人为因素)。

代码最大的问题不是编写它,而是维护它。所以你的代码MUST被写成易于维护的下一个人(一个公司将花费更多的维护,然后开发新的代码)。古老的谚语是写你的代码,知道维护者是一个斧头谋杀,知道你住在哪里。

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

2nd'd。但是不要忘记,对于原始类型的常量在重载解析时确实会降级到相同的签名。 – gimpf 2010-10-16 18:43:15

1

编译器产生什么完全取决于你的编译器标志和平台。这将是一个有趣的练习,使用完全优化(仅给它们diff函数名称)为上述每个生成汇编器输出,并将其发布到此处以进行明确的评论,或作为单独的问题)。我的猜测是你很可能关心性能 - 如果是这样,我只需编写一个小封装应用程序来调用每个函数N次,然后输出相关的时序,可能不包括cout部分,以避免控制台I/O扭曲结果。

0

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

+0

对于像这样的小功能,主流多寄存器CPU上的许多编译器不需要堆栈空间来完成这项工作。 – 2010-10-16 18:40:47

+0

说到优化,除了与标准定义的外部行为相同之外,您可以不承担任何责任。另外,错误。 – gimpf 2010-10-16 18:41:41

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'; 
} 

注意我们把事物之间的空间出于同样的原因weputspacesbetweenwords,给的东西有意义的名字,所以它实际上是可读......

相关问题