c – 为什么这个程序没有优化?

c – 为什么这个程序没有优化?,第1张

概述考虑以下,简单的程序(从 this question改编): #include <cstdlib>int main(int argc, char** argv) { int mul1[10] = { 4, 1, 8, 6, 3, 2, 5, 8, 6, 7 }; // sum = 50 int mul2[10] = { 4, 1, 8, 6, 7, 9, 5, 1, 2, 3 考虑以下,简单的程序(从 this question改编):
#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 – 为什么这个程序没有优化?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1251444.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存