长行整数运算

Mar*_*m0t 2 c++

两部分我的问题.哪个更有效/更快:

int a,b,c,d,e,f;
int a1,b1,c1,d1,e1,f1;
int SumValue=0; // oops forgot zero
// ... define all values
SumValue=a*a1+b*b1+c*c1+d*d1+e*e1*f*f1;
Run Code Online (Sandbox Code Playgroud)

要么

Sumvalue+=a*a1+b*b1+c*c1;
Sumvalue+=d*d1+e*e1*f*f1;
Run Code Online (Sandbox Code Playgroud)

我猜第一个是.我的第二个问题是为什么.

我想第三个问题是,在任何时候都需要打破一个加法运算(除了编译器对行连续数的限制等等).

编辑

是否只有当整个算术运算无法适应缓存时,我才会看到减速?我认为这是不可能的 - 在这种情况发生之前,编译器可能会因为两次线路延续而感到生气.也许我明天要玩,看看.

Fré*_*idi 5

你测量过了吗?两种方法的优化机器代码可能非常相似,如果不相同的话.

编辑:我刚试过这个,结果是我的预期:

$ gcc -O2 -S math1.c  # your first approach
$ gcc -O2 -S math2.c  # your second approach
$ diff -u math1.s math2.s

--- math1.s 2010-10-26 19:35:06.487021094 +0200
+++ math2.s 2010-10-26 19:35:08.918020954 +0200
@@ -1,4 +1,4 @@
-   .file   "math1.c"
+   .file   "math2.c"
    .section    .rodata.str1.1,"aMS",@progbits,1
 .LC0:
    .string "%d\n"
Run Code Online (Sandbox Code Playgroud)

而已.相同的机器代码.

  • 是的,但是您生成的机器代码可能甚至不执行算术,至少如果您从OP复制粘贴片段.如果你使用优化标志,它可能会优化算术,因为你实际上没有对`SumValue`做任何事情.当我查看由gcc生成的程序集时,如果我设置优化标志,它甚至不会进行算术运算.`.main`部分中唯一的东西是`ret`指令. (2认同)