c++ - 使用 Visual Studio 2005 展开小循环

标签 c++ visual-studio-2005 compiler-construction visual-c++-2005

你如何告诉编译器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 进行了关于哪个更有效的讨论,但无论如何,我们都欢迎对此发表任何评论。

最佳答案

通常你只是让编译器完成它的工作。如果循环数在编译时已知,并且启用了编译器优化,则编译器将在代码大小与分支减少之间取得平衡,并展开任何可展开的循环。

如果这真的不是您想要的,也可以使用 Duff 的设备自己完成:(来自维基百科)

send(to, from, count)
register short *to, *from;
register count;
{
    register n=(count+7)/8;
    switch(count%8){
    case 0: do{ *to = *from++;
    case 7:     *to = *from++;
    case 6:     *to = *from++;
    case 5:     *to = *from++;
    case 4:     *to = *from++;
    case 3:     *to = *from++;
    case 2:     *to = *from++;
    case 1:     *to = *from++;
        }while(--n>0);
    }
}

这使您可以使用运行时确定的迭代计数展开。

如果它仍然是您想要的编译时展开,并且内置优化不是您想要的(如果您想要更细粒度的控制),您可以创建一个 C++ 模板来执行您想要的操作。这是一个非常简单的模板应用程序,并且由于它全部在编译时完成,因此您不会丢失任何函数内联或编译器可能另外执行的其他优化。

关于c++ - 使用 Visual Studio 2005 展开小循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1368429/

相关文章:

c++ - Qt/C++ QTcpSocket 导致内存泄漏,不知道为什么

c++ - 如何正确迭代QT的STL风格 vector

c - mysql语法中的bit_expr是什么?

java - ANTLR 检查 commontree 是否正确或如何检查给定输入是否与 ANTLR 语法匹配?

c++ - boost::optional 对 bool 的隐式转换消失了吗?

c++ - C 的 -> 是否等同于 Objective-C 中的点符号

c# - VS2005 库

使用 MSVC++ 2005 的 Windows 上的 C++ 内存问题和诊断

c# - 如何创建一个dll文件

表达式评估中的编译器差异