C++ 编译器是否会简化按顺序多次执行的操作?

C++ 编译器是否会简化按顺序多次执行的操作?,c++,c,optimization,C++,C,Optimization,这个问题我已经问了很长时间了,但我不知道该去哪里找。如果某个操作被多次编写,编译器会简化它还是运行完全相同的操作并得到完全相同的答案 例如,在以下类似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 - oth

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

例如,在以下类似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);
}

for(int i=0;i执行哪些优化取决于编译器、您指定的编译器和体系结构

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

  • 这会使二进制文件变大,因此这是一种折衷;例如,您可能不希望在内存非常少的小型微处理器上实现这一点
  • 您可以非常确定,
    (i%3)*10
    在每次循环迭代中只执行一次
关于您对视觉清晰度与优化的担忧:在处理像您这样的“局部情况”时,您应该关注代码清晰度

优化增益通常是在更高的层次上实现的;例如在您使用的算法中


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

是的,按顺序执行多次的操作将由编译器优化

更详细地说,所有主要编译器(GCC、Clang和MSVC)都将
(i%3)*10
的值存储到临时(临时、垃圾)寄存器中,然后在再次使用等效表达式时使用该寄存器。
对于GCC,这种优化称为GCSE(GNU公共子表达式消除),否则称为CSE。

这占用了计算循环所需的大量时间。

当然,您应该删除代码中存在的混淆:

for (int i = 0; i < 100; ++i) {
    int i30 = i % 3 * 10;
    int r = someFunction(i30);
    array[i30] = r;
    anotherFunction(-r);
}
for(int i=0;i<100;++i){
int i30=i%3*10;
int r=someFunction(i30);
数组[i30]=r;
另一个函数(-r);
}
突然,它看起来简单多了

将其留给编译器(使用适当的选项)来优化代码,除非您发现在测量后确实需要帮忙。

在这种情况下,对编译器来说,展开三次似乎是一个好主意。尽管内联可能总是显示出更好的选项。

如果您真的想进行微优化,您可以尝试两个版本的代码,并对其进行计时,看看哪一个更快。通常这取决于编译器是否以及如何进行优化编译代码,结果很可能是一样的。关于编译器是否会进行优化的问题毫无意义,除非您指定要使用的编译器。相关(如果不相同):无论编译器将做什么,从可读性和维护角度来看,都要使用临时变量删除复制,从而删除所有副本。此外,如果您有兴趣了解有关它的更多信息和/或使用什么搜索词,则会调用您所指的优化