c++ - 编译器会简化按顺序执行多次的操作吗?

标签 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 - 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/

相关文章:

xcode - 我可以测量现代 Intel Mac OS X 上的分支预测失败吗?

c++ - 使用C++对ipv6地址进行比较操作

c++ - 二进制文件脱机排序失败

c# - 如果模态对话框打开,Task.Factory.StartNew() 在错误的线程上运行

c - 如何从不同的 C 程序调用 C 程序的 main()?

c - 在gtk c中的对话框中打印输入框的值

c++ - 在偏序上使用 min_element

c - 将windows中的linux静态库与cygwin链接起来

javascript - 如何配置 gulpjs,以便 ngrok 模块可用于为 pagespeed Insight 插件提供 url?

PHP 缓存控制似乎不起作用