#include <cstdlib>int main(int argc,char** argv) { int mul1[10] = { 4,1,8,6,3,2,5,7 }; // sum = 50 int mul2[10] = { 4,7,9,3 }; // sum = 46 int x1 = std::atoi(argv[1]); int x2 = std::atoi(argv[2]); int result = 0; // For each element in mul1/mul2,accumulate the product with x1/x2 in result for (int i = 0; i < 10; ++i) { result += x1 * mul1[i] + x2 * mul2[i]; } return result;}
我相信它在功能上等同于以下内容:
#include <cstdlib>int main(int argc,char** argv) { int x1 = std::atoi(argv[1]); int x2 = std::atoi(argv[2]); return x1 * 50 + x2 * 46;}
而clang 3.7.1,gcc 5.3和icc 13.0.1似乎无法做出这样的优化,即使使用-Ofast. (注意生成的程序集在编译器之间有很大的不同)!然而,当从等式中删除mul2和x2时,即使使用-O2,clang也能执行类似的优化.
什么阻止编译器将第一个程序优化到第二个程序?
解决方法 完整的表达对于cl is来说太复杂了.如果你拆分它,那么所有的东西再次被优化:int result1 = 0;int result2 = 0;for (int i = 0; i < 10; ++i) { result1 += x1 * mul1[i]; result2 += x2 * mul2[i];}std::cout << (result1 + result2);总结
以上是内存溢出为你收集整理的c – 为什么这个程序没有优化?全部内容,希望文章能够帮你解决c – 为什么这个程序没有优化?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)