c – 重复一段代码固定次数

前端之家收集整理的这篇文章主要介绍了c – 重复一段代码固定次数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图重复一段代码,不使用条件,但仍然只重复特定次数.

基本上,这样的事情:

repeat(50)
{
    //Do stuff here.
}

有没有办法做到这一点?复制和粘贴50次以外?

我这样做是因为我想如果我知道有多少次我想重复一些事情,那么每次检查一个条件要快得多.这是准确的吗?或者我还会检查它重复了多少次?

基本上,它是否更快?

解决方法

您尝试通过使用某些构造(包括手动切割和粘贴代码)来优化循环以优化循环的执行速度是不明智的.不要这样做;它可能会“取消优化”执行速度.

在我曾经遇到的任何C实现中(MSVC 6.0,2003,2005,2010,GCC各种版本,Diab各种版本),绝对没有,对不起我没有强调足够,ZERO,时间涉及分配循环计数变量,假设为分配循环计数变量的函数分配了任何其他变量.对于一个不进行函数调用的简单循环,循环计数变量甚至可能永远不会将其输出到内存中;它可以在整个生命周期内完全保存在单个cpu寄存器中.即使它存储在内存中,它也会在运行时堆栈上,并且它的空间(以及任何其他局部变量)将在一次操作中一次性声明,这不会花费更多或更少的时间,具体取决于堆栈上分配的变量.像循环计数器变量这样的局部变量在堆栈上分配,堆栈分配是CHEAP CHEAP CHEAP,而不是堆分配.

堆栈上的示例循环计数器变量分配:

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次迭代展开到仅循环体的5个副本的10次迭代将是速度优势.循环变量仍然存在,但不是对循环计数器进行50次比较,现在代码只需进行10次比较.这是一个权衡,因为循环体的5个副本在缓存中占用了5倍的空间,这意味着加载相同指令的额外副本会强制缓存逐出(抛出)已经存在的许多指令缓存以及您可能希望保留在缓存中的缓存.此外,从主存储器加载循环体指令的这4个额外副本所花费的时间比在没有展开循环的情况下从缓存中简单地抓取已经加载的指令要长得多.

总而言之,仅使用循环体的一个副本并继续将循环逻辑留在原位通常更有利. (即,根本不进行任何循环展开.)

猜你在找的C&C++相关文章