C++ 将一段代码重复固定次数
我试图在不使用条件的情况下重复一段代码,但仍然只重复特定次数 基本上是这样的:C++ 将一段代码重复固定次数,c++,performance,repeat,C++,Performance,Repeat,我试图在不使用条件的情况下重复一段代码,但仍然只重复特定次数 基本上是这样的: repeat(50) { //Do stuff here. } 有办法做到这一点吗?除了复制粘贴50次以外 我这么做是因为我想如果我知道我想重复多少次,这会比每次检查一个条件要快。准确吗?或者我还会检查它重复了多少次 基本上,它会更快吗?我不得不说,速度的最大提高是您没有分配迭代变量,但您所要求的将不可避免地需要检查一个条件。本质上,你所拥有的如下 int i = 0; for(; i< 50; i+
repeat(50)
{
//Do stuff here.
}
有办法做到这一点吗?除了复制粘贴50次以外
我这么做是因为我想如果我知道我想重复多少次,这会比每次检查一个条件要快。准确吗?或者我还会检查它重复了多少次
基本上,它会更快吗?我不得不说,速度的最大提高是您没有分配迭代变量,但您所要求的将不可避免地需要检查一个条件。本质上,你所拥有的如下
int i = 0;
for(; i< 50; i++)
{
Do Something.
}
inti=0;
对于(;i<50;i++)
{
做点什么。
}
我之所以将I移到for循环外部,是为了说明它可以是循环之前初始化的任何变量。这与
for(int i =0; i< 50; i++)
{
}
for(int i=0;i<50;i++)
{
}
<代码> >重复(x)<代码>作为语言的一部分,但不可能有某种原因——C和C++的设计有点遵循处理器可以做的事情,而且我不熟悉一个处理器(我已经用大约10种不同的处理器体系结构)来做一个“循环此多次”,而不是某种形式的“检查是否达到数字”
因此,您必须编写一些代码来检查重复某项操作的次数(或者,还有多少次要做-有一条名为“loop”的x86指令正在进行此操作-倒计时,如果计数器不为零,则跳到循环的开头)
如果编译器希望“展开”一个循环,因为它有一个恒定的迭代次数,并且它决定“展开它更快”[编译器一直在决定这类事情,并且经常正确处理],那么编译器可能会这样做。但是你仍然必须编写“检查”的代码“您试图通过使用某种构造(包括手动剪切和粘贴代码)来优化循环的执行速度,这是不明智的。不要这样做;它可能会“取消优化”执行速度
在我所遇到的任何C++实现(MSVC 6、2003, 2005, 2010、GCC各种版本、DIAI不同版本)中,绝对零,抱歉我没有强调足够的,零,时间分配循环计数变量,假设为分配循环计数变量的函数分配了任何其他变量。对于一个不进行函数调用的简单循环,循环计数变量甚至可能永远也不会输出到内存中;它可能在整个生命周期内完全保存在单个CPU寄存器中。即使它存储在内存中,它也将位于运行时堆栈上,并且它(以及任何其他局部变量)的空间将在单个操作中一次全部占用,这不需要花费多少时间,具体取决于堆栈上分配的变量数。局部变量(如循环计数器变量)是在堆栈上分配的,堆栈分配比堆分配便宜
堆栈上的循环计数器变量分配示例:
for (int i=0; i<50; ++i) {
....
}
int i = 0;
for (; i<50; ++i) {
....
}
for(inti=0;i如果您想要能够编写repeat(x){}
这样的语法精确性,那么您可以使用宏
比如:
#include <iostream>
#define repeat(x) for(int i = x; i--;)
int main()
{
repeat(10)
{
std::cout << i << std::endl;
}
return 0;
}
#包括
#为(int i=x;i--;)定义重复(x)
int main()
{
重复(10)
{
std::cout这个怎么样:
typedef std::vector<int> times;
for (auto count : times(5))
{
// execute the loop 5 times
}
typedef std::向量时间;
用于(自动计数:次(5))
{
//执行循环5次
}
你是在寻找一个硬的重复吗?就像在50次没有任何条件的代码执行中一样?据我所知,编译器通常会使用文本大小(不基于变量)优化for循环,并将其写入与将代码写入x次相同的结果代码中。因此重复(50)
将与for相同(i=0;i@MrUniverse很好,谢谢,这正是我所需要的。@MrUniverse-循环展开是一个微妙的问题,“优化”不仅仅是消除循环开销指令的问题。循环展开创建额外指令(循环主体的副本),这意味着展开循环的代码现在会占用更多的缓存,这意味着您可能希望留在缓存中的其他代码必须被逐出以保留展开循环代码,该代码可能只执行一次(即不再需要)。如果保留循环逻辑,缓存会突然变得非常有意义,循环开销会变成一种祝福而不是诅咒。@phonetagger评论不错,都是真的:)感谢上帝,我不是一个编译器,生活会非常复杂。为什么不为(int I=0;I<…)编写
?与上面完全相同?只是将初始化移出for循环。只是声明它可能是在循环之前的任何点创建的变量。无论如何,变量不会每次都被分配,此代码相当于在循环内声明i
。但是,我知道如果他想保存分配,他可以使用不同的变量,而不必使用新的变量。这就是我的意思。编译器最好使用“fresh”每次执行循环时都要使用变量,因为编译器不必知道您是否需要稍后某个地方的变量…好的,感谢处理器的工作,这很有趣。完全忘记了编译器的优化。第二个循环永远不会执行。我猜您的意思是int I=0;
?@AnotherTest-您为代码同行评审做好准备!谢谢。
typedef std::vector<int> times;
for (auto count : times(5))
{
// execute the loop 5 times
}