首页 > 解决方案 > 编译器会简化按顺序执行多次的操作吗?

问题描述

我已经有这个问题很长时间了,但不知道在哪里看。如果某个操作被多次编写,编译器会简化它还是会运行完全相同的操作并得到完全相同的答案?

例如,在下面的类似 c 的伪代码(i%3)*10中重复了很多次。

for(int i=0; i<100; i++) {
    array[(i%3)*10] = someFunction((i%3)*10);
    int otherVar = (i%3)*10 + array[(i%3)*10];
    int lastVar = (i%3)*10 - otherVar;
    anotherFunction(lastVar);
}

我知道变量对于视觉目的会更好,但它也更快吗?(i%3)*10每个循环计算5次?

在某些情况下,我不知道是使用变量更快还是离开原始操作更快。

编辑:在 win 10 上使用 gcc (MinGW.org GCC-8.2.0-3) 8.2.0

标签: c++coptimization

解决方案


进行哪些优化取决于编译器、您指定的编译器优化标志和体系结构。

以下是您的示例的一些可能的优化:

  • 循环展开这会使二进制文件变大,因此是一种权衡;例如,您可能不希望在内存很少的微型微处理器上使用它。
  • 通用子表达式消除 (CSE)您可以非常确定(i % 3) * 10每次循环迭代只会执行一次。

关于您对视觉清晰度与优化的担忧:在处理像您这样的“本地情况”时,您应该关注代码清晰度。

优化收益通常是在更高的水平上获得的;例如在您使用的算法中。

关于优化有很多话要说;以上只是一些开场白。很高兴您对事物的工作方式感兴趣,因为这对于优秀的 (C/C++) 程序员很重要。


推荐阅读