gpt4 book ai didi

c++ for range循环比递减循环更快

转载 作者:太空狗 更新时间:2023-10-29 20:39:52 24 4
gpt4 key购买 nike

我们经常以这种方式从最后一个元素开始遍历数组:

static const char* pszStrings[] = { ... }
for (size_t i = _countof(pszStrings); i--;)
use(pszStrings[i]);

我的问题是,如果新的基于范围的 for 循环同样有效并因此被使用:

static const char* pszStrings[] = { ... }
for (auto string : pszStrings)
use(string);

另外……

由于我无法查看生成的代码,即使我不知道,如果我能够得出正确的结论,我会很高兴得到不太科学的答案!

最佳答案

编译器可以对新的 range for-loop 中的迭代集合做出很多假设。 ,在之前编写的 for 循环中。示例:

在 C++98 天通常一个写:

for (std::vector<int>::const_iterator it = v.begin(), it_end = v.end(); 
it != it_end; ++it) {
// code ..
}

it_end使用它是因为在很多情况下,编译器无法确定集合不会在 for 循环内更改大小(并且 .end() 可能会更改)。如果你写:

for (std::vector<int>::const_iterator it = v.begin(); it != v.end(); ++it) {
// code ..
}

编译器可以生成对 .end() 的调用每次执行循环的函数。

range for-loop与旧的 for 循环一样高效(有时更高效)。

一些例子:

如果你有一个迭代 std::vector 的循环按索引:for (int i = 0; i < v.size(); ++i)此循环需要索引 vector 以使用元素 ( v[i] ) 最确定不会出现明显的等待,但当 vector 非常大时,可能会注意到紧密循环。

当更新到 range for-loop 时,这种循环会得到改善.

答案中的第一个循环很可能不会提高性能,但为了清楚起见,代码的读者会知道代码是为了迭代所有集合而不是跳过一些元素(以旧方式,您可以在 for 循环中识别 for-each pattern,但它很乏味,如果不小心,可能会导致关于代码的错误结论(可能在正文中正在修改索引或迭代器)。

关于c++ for range循环比递减循环更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26258679/

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