应该在以下C代码中优化哪个变量

时间:2011-03-16 12:59:12

标签: c optimization compiler-optimization

如果你的编译器实际上优化了每个函数只有两个寄存器变量的访问时间,那么下面程序中哪两个变量最好被用作寄存器变量?

void main(void)
{
  int i,j,k,m;
  do
  {
    printf("enter value");
    scanf(“%d”,&i);
    m=0;
    for(k=0;k<100;k++)
      m=k+m;
  }
  while(i>0);
}

如果有任何错误,请忽略......

5 个答案:

答案 0 :(得分:5)

诡计?在智能编译器中,没有任何变量被注册。 i有地址,所以它不能一直在寄存器中。应该优化jkm

答案 1 :(得分:4)

当然不是j,因为它从未使用过。不是i,因为你正在使用address-of运算符写入它,这意味着它需要在scanf写入之后从内存中读回。这只留下km

答案 2 :(得分:3)

优秀的编译器将优化这部分代码:

m=0;
for(k=0;k<100;k++)
  m=k+m;

并将其替换为m = 4950; :) 更好的是优化m = 4950;并且不做任何事情。 j也将进行优化。并且i无法注册,因为在scanf中需要其地址。所以最后的答案是“没有人”。

答案 3 :(得分:2)

我猜编译器会选择k和m

答案 4 :(得分:1)

由于从未使用过计算结果,编译器可以优化几乎所有代码。唯一必须保留的东西等同于

int main(void) {
  int i;
  do {
    printf("enter value");
    scanf(“%d”,&i);
  } while(i>0);
  return 0;
}

正如其他人已经说过的那样,唯一剩下的变量i不能是register存储类,因为它的地址是。