这个问题我想了很久,但一直不知道去哪里找。如果多次编写某个操作,编译器会简化它还是会运行完全相同的操作并得到完全相同的答案?
例如,在下面的类似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
最佳答案
完成哪些优化取决于编译器,compiler optimization flag(s)您指定的架构。
以下是针对您的示例的一些可能的优化:
- Loop Unrolling这使得二进制文件更大,因此是一种权衡;例如,您可能不希望在内存非常小的微型微处理器上使用它。
- Common Subexpression Elimination (CSE)您可以非常确定您的
(i % 3) * 10
每次循环迭代只会执行一次。
关于您对视觉清晰度与优化的关注:在处理像您这样的“本地情况”时,您应该关注代码清晰度。
优化 yield 通常要在更高的层次上进行;例如在您使用的算法中。
关于优化有很多要说的;以上只是一些开场白。很高兴您对事物的工作原理感兴趣,因为这对于优秀的 (C/C++) 程序员很重要。
关于c++ - 编译器会简化按顺序执行多次的操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57669201/