gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:04:35 27 4
gpt4 key购买 nike

你如何告诉编译器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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com