Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译器会自动优化重复代码吗?_C++_Optimization_Compiler Optimization - Fatal编程技术网

C++ 编译器会自动优化重复代码吗?

C++ 编译器会自动优化重复代码吗?,c++,optimization,compiler-optimization,C++,Optimization,Compiler Optimization,如果我有一些简单的算术代码,重复了好几次。编译器会自动优化它吗 下面是一个例子: someArray[index + 1] = 5; otherArray[index + 1] = 7; 从性能角度(而不是从可读性和可维护性良好的代码角度)引入变量nextIndex=index+1有意义吗或者编译器会自动进行此类优化?您不必担心这样的琐碎优化,因为几乎所有编译器都会持续10-15年或更长时间 但是,如果您的代码中有一个非常关键的位置,并且希望获得最大的运行速度,那么您可以检查生成的汇编代码中的

如果我有一些简单的算术代码,重复了好几次。编译器会自动优化它吗

下面是一个例子:

someArray[index + 1] = 5;
otherArray[index + 1] = 7;

从性能角度(而不是从可读性和可维护性良好的代码角度)引入变量
nextIndex=index+1有意义吗或者编译器会自动进行此类优化?

您不必担心这样的琐碎优化,因为几乎所有编译器都会持续10-15年或更长时间

但是,如果您的代码中有一个非常关键的位置,并且希望获得最大的运行速度,那么您可以检查生成的汇编代码中的这行代码,以确保编译器进行了这一微不足道的优化

在某些情况下,一次算术加法可能比保存在寄存器或内存中更快,编译器知道这一点。如果您尝试手动优化琐碎的情况,那么您的代码会变慢

您还可以使用在线服务,如检查生成的代码(支持多个版本的gcc、clang、icc)。

古老的格言“吸进去看看”在这里似乎很合适。我们常常忘记,到目前为止,最常见的处理器是4/8/16位微处理器,它们具有奇怪而奇妙的特定于应用程序的体系结构,以及与之配套的特定于供应商的编译器。他们经常使用编译器扩展来“帮助”(或混淆)编译器生成“更好”的代码

21世纪初的一个DSP在流水线中并行执行每个时钟周期8条指令(复杂——“加载+增量+乘法+加法+整数”)。这项工作的先决条件是必须事先将所有内容预加载到寄存器中。这意味着,注册显然是在溢价(一如既往)。在这种体系结构中,最好将结果存储到空闲寄存器中,并使用无法并行的空闲插槽(某些指令禁止在同一周期中使用其他指令)稍后重新计算。编译器是否“正确”了?。是的,它经常保留结果以供以后重用,结果是由于缺少寄存器而导致管道暂停,从而导致执行速度降低

所以,您编译它,检查它,分析它等等,以确保当编译器得到它“正确”时,我们可以进入并修复它。如果没有语言不支持的附加语义信息,就很难知道什么是“正确的”


结论:吮吸它,然后看

是的。这是一个常见的优化

好吧,如果索引是一种基本的整数类型,那么在启用优化的情况下很可能会启用。为什么不在启用优化的情况下构建,并检查生成的代码?编译它并检查程序集。可以想象,这是可能的,但我怀疑这些不是被索引的同一个对象。即使是这样,非内联重载的
操作符[]
也会使优化器失效。哦。。。误读了。