gpt4 book ai didi

c++ - 重复一段代码固定次数

转载 作者:可可西里 更新时间:2023-11-01 17:16:11 26 4
gpt4 key购买 nike

我试图在不使用条件的情况下重复一段代码,但仍然只重复特定次数。

基本上,是这样的:

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

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

我这样做是因为我想如果我知道我想重复某件事多少次,它会比每次都检查条件更快。那是准确的吗?或者我是否仍会检查重复了多少次?

基本上,它是否更快?

最佳答案

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

在我遇到过的任何 C++ 实现中(MSVC 6.0、2003、2005、2010、GCC 各种版本、Diab 各种版本),绝对是零,抱歉我没有强调足够,零,涉及的时间分配循环计数变量,假设为分配循环计数变量的函数分配了任何其他变量。对于不进行函数调用的简单循环,循环计数变量可能永远不会进入内存;它可以在整个生命周期内完全保存在一个 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 次迭代展开到只有 10 次迭代和 5 个循环体拷贝将具有速度优势。循环变量仍然存在,但不再对循环计数器进行 50 次比较,现在代码只需要进行 10 次比较。这是一个权衡,因为循环体的 5 个拷贝占用了缓存中 5 倍的空间,这意味着加载相同指令的那些额外拷贝会强制缓存驱逐(丢弃)已经存在的许多指令缓存以及您可能希望保留在缓存中的内容。此外,在循环根本没有展开的情况下,从主内存加载循环体指令的这 4 个额外拷贝比简单地从缓存中获取已加载的指令要花费更长的时间。

所以总而言之,只使用循环体的一个拷贝并继续并保留循环逻辑通常更有利。 (即根本不要展开任何循环。)

关于c++ - 重复一段代码固定次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16268863/

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