【发布时间】:2009-09-02 15:33:50
【问题描述】:
如何根据迭代次数或其他属性告诉编译器unroll loops?或者,如何在 Visual Studio 2005 中启用循环展开优化?
编辑:例如
//Code Snippet 1
vector<int> b;
for(int i=0;i<3;++i) b.push_back(i);
相对
//Code Snippet 2
vector<int> b;
b.push_back(0);
b.push_back(1);
b.push_back(2);
push_back() 是一个例子,我可以用任何可能需要很长时间的东西来替换它。
但我在某处读到我可以使用代码 1,如果循环满足某些条件,编译器可以将其展开为代码 2。所以我的问题是:你是怎么做到的?已经有关于 SO 的讨论,关于哪个更有效,但无论如何,任何 cmets 都会受到赞赏。
【问题讨论】:
-
“展开”是什么意思?
-
我想你有一个具体的循环,你通过测量发现循环需要很长时间。你为什么不把那个循环贴出来让我们看看?
-
push_back 的开销可能比循环的开销大一个数量级。这是试图优化错误事物的一个很好的例子。
-
澄清所有这些好的答案:别担心。它不会有什么不同,而且你不可能知道,直到你在真实情况下测试它。您假设您比编译器了解更多,这是一件坏事。
-
请:这个问题很重要!这个例子应该解释他想说什么,而不是一个例子,它是有意义的。你们都说展开循环根本没有意义吗?如果没有,那么请帮助我们需要知道它是如何完成的。这个问题,你应该什么时候做,这里没有被问到。
标签: c++ visual-studio-2005 compiler-construction visual-c++-2005