我想重复一段代码,但不使用条件语句,仍然可以指定重复的次数。
基本上,就像这样:
repeat(50)
{
//Do stuff here.
}
除了复制粘贴50次之外,有没有其他方法可以做到这一点?
我这样做是因为我想如果我知道我想重复多少次某件事情,那么比每次检查条件要快。这准确吗?还是我仍然会检查它已经重复了多少次?
基本上,这样做会更快吗?
我想重复一段代码,但不使用条件语句,仍然可以指定重复的次数。
基本上,就像这样:
repeat(50)
{
//Do stuff here.
}
除了复制粘贴50次之外,有没有其他方法可以做到这一点?
我这样做是因为我想如果我知道我想重复多少次某件事情,那么比每次检查条件要快。这准确吗?还是我仍然会检查它已经重复了多少次?
基本上,这样做会更快吗?
你试图通过使用某些构造来优化循环(包括手动剪切和粘贴代码)以优化循环的执行速度是不明智的。不要这样做;它可能会降低执行速度,而不是提高它。
在我遇到的任何C++实现中(MSVC 6.0、2003、2005、2010,GCC各个版本,Diab各个版本),假设函数中已经分配了其他变量,分配一个循环计数变量绝对不需要时间。对于一个简单的循环,如果没有函数调用,循环计数变量甚至可能永远不会到达内存;它可能在整个生命周期中完全保存在单个CPU寄存器中。即使它存储在内存中,它也会在运行时堆栈上,为它(和任何其他局部变量)分配空间将在单个操作中一次性完成,无论在堆栈上分配的变量数量多少,所需的时间都是相同的。像循环计数变量这样的局部变量在堆栈上分配,而堆栈分配是非常便宜的,与堆分配相比。
堆栈上的示例循环计数变量分配:
for (int i=0; i<50; ++i) {
....
}
另一个例子是在堆栈上分配循环计数器变量:
int i = 0;
for (; i<50; ++i) {
....
}
在堆上分配的循环计数变量示例(不要这样做;这是愚蠢的):
int* ip = new int;
for (*ip=0; *ip<50; ++(*ip)) {
....
}
delete ip;
现在来解决手动复制和粘贴以优化循环的问题,而不是使用循环和计数器:
你正在考虑的是手动展开循环。循环展开是编译器有时用于减少循环中开销的一种优化方法。只有当循环的迭代次数可以在编译时知道时(即迭代次数是一个常数,即使常数基于其他常数的计算),编译器才能这样做。在某些情况下,编译器可能确定展开循环是值得的,但通常它不会完全展开它。例如,在您的示例中,编译器可以确定从50次迭代到仅10次迭代,并复制5次循环体将加快速度。循环变量仍然存在,但现在代码只需要执行10次循环计数器的比较,而不是50次。这是一种权衡,因为循环体的5个副本在高速缓存中占用了5倍的空间,这意味着加载那些额外的相同指令的副本会强制高速缓存驱逐(丢弃)已经在高速缓存中并且您可能希望保留在高速缓存中的指令数量。此外,从主内存加载循环体指令的那4个额外副本比在不展开循环的情况下直接获取已加载指令从高速缓存中花费的时间要长得多。
总而言之,通常更有利的做法是只使用一个循环体的副本并继续保留循环逻辑(即根本不进行任何循环展开)。
int i = 0;
? - Alephrepeat(x) {}
这样漂亮的句法结构,那么您可以使用宏。#include <iostream>
#define repeat(x) for(int i = x; i--;)
int main()
{
repeat(10)
{
std::cout << i << std::endl;
}
return 0;
}
int i = 0;
for(; i< 50; i++)
{
Do Something.
}
for(int i =0; i< 50; i++)
{
}
for(int i = 0; i < ...)
? - Mats Peterssoni
。 - Hunter McMillen这个怎么样:
typedef std::vector<int> times;
for (auto count : times(5))
{
// execute the loop 5 times
}
repeat(50)
与for(char i=0; i<50; i++)
是相同的(我使用char类型,因为万一它没有被优化掉,它不会为int
分配4个字节,而只会为char
分配1个字节)。 - Sellorio