优化"for"循环
Optimize "for" loop
std::vector<int> someVector;
for (unsigned int i = 0; i < someVector.size(); i++)
{
// do something
}
每次都计算someVector.size()
的值吗?
我已经用GCC浏览器检查过了:
代码输入:
#include<vector>
int sum(const std::vector<int> & someVector) {
int s = 0;
for (int i = 0; i < someVector.size(); i++) {
s += someVector[i];
}
return s;
}
int main() {
std::vector<int> someVector;
return sum(someVector);
};
为sum()生成的程序集:
movq (%rdi), %rcx
movq 8(%rdi), %rdx
xorl %eax, %eax
cmpq %rcx, %rdx
je .LBB0_3
subq %rcx, %rdx
sarq $2, %rdx
xorl %eax, %eax
xorl %esi, %esi
.LBB0_2: # =>This Inner Loop Header: Depth=1
addl (%rcx,%rsi,4), %eax
incq %rsi
cmpq %rdx, %rsi
jb .LBB0_2
.LBB0_3: # %._crit_edge
ret
。大小保存在%rdx
中——每次都不调用size()
。
正如其他人已经指出的,结果可能取决于
- 你的编译器,
- 优化设置和
- 你在循环中实际做的事情(点击上面的gcc资源管理器链接可以自己尝试)。
不需要计算任何东西,整个循环就被优化了。
是否someevector .length()的值得到计算每次?
可能是,这取决于循环的内容和许多其他东西。例如,vector的大小可以在循环内部修改。然后你的编译器必须能够发现如果不是这种情况。因此,必须满足几个条件才能优化出来。
如果您要求在循环中只调用一次std::vector::size()
,那么最好的(也是唯一的)策略是通过对代码进行简单的修改来完全回避这个问题:
std::vector<int> someVector;
for (unsigned int i = 0, length = someVector.size(); i < length; ++i)
{
// do something
}
这取决于编译器的优化。
它可能会循环优化,(如果可能的话没有提到像volatile这样的东西)
编译器将把不依赖于循环的数据(不相关的)放在外面。
那么它可能会生成类似
的内容int length = someVector.length();
for (unsigned int i = 0; i < length; i++)
{
// do something
}
有许多编译器优化技术,它将做。
默认情况下,c++中有一些"纯函数" string.length()总是被优化的。我不确定向量。相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么我的for循环不能正确获取argv
- 在基于范围的for循环中使用结构化绑定声明
- 通过for循环使用用户输入填充列表
- 使用for循环检查数组中的重复项
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 正在使用for循环创建QScatterSerie
- Python中的for循环与C++有何不同
- 在更改for循环的第三部分后,未使用for循环结果
- 在 for 循环中查找问题时遇到困难
- 嵌套for循环C++的问题(初学者)
- 如何用for循环在c++中生成单词三角形
- 如何在for循环中包含两个索引值的测试条件
- 带有多个独立参数的C++For循环
- C++ Python 循环"for i, num in enumerate(list):"版本
- C 多循环 for () 基础知识
- 没有条件值的 FOR 循环"for (int i = 1; ; i++)"无法正常工作
- 为用户提供循环for循环的选项
- 打破循环for循环