C ++ 11基于范围的循环效率“const auto&i”与“auto i”
在C ++ 11中,我可以像这样迭代一些容器:
for(auto i : vec){ std::cout << i << std::endl; }
但是我知道这是毫无必要的,因为我只需要打印 vec
的值就可以得到vec
每个元素的副本,所以我可以这样做:
for(auto &i : vec){ std::cout << i << std::endl; }
但是我想确保vec
的值永远不会被修改,并遵守const的正确性,所以我可以这样做:
for(const auto &i : vec){ std::cout << i << std::endl; }
所以我的问题是:如果我只需要看一些容器的值,不会最后一个循环( const auto &i
)总是首选,因为没有额外的副本效率提高( 编辑 :每个元素的) vec
?
我有一个我正在开发的程序,我正在考虑在整个过程中进行这样的改变,因为效率是非常关键的(我在第一个地方使用C ++的原因)。
是。 同样的原因,如果你只读过你参数const&
的参数。
T // I'm copying this T& // I'm modifying this const T& // I'm reading this
这些是你的“默认”。 当T
是一个基本types(内置)时,通常你只是回到const T
(无参考)进行读取,因为副本比别名更便宜。
我有一个我正在开发的程序,我正在考虑在整个过程中进行这种改变,因为效率是非常关键的
- 不要盲目的改变。 一个工作程序比一个快速但破碎的程序要好。
- 你如何遍历你的循环可能不会有太大的区别; 你正在循环的原因,不是吗? 你的循环的身体将更有可能是罪魁祸首。
- 如果效率非常关键,那么您希望使用分析器来查找程序的哪些部分实际上很慢,而不是猜测可能较慢的部分。 见#2为什么你的猜测可能是错的。
想象一下,如果你的vector包含string。 长串。 5000个长string。 不必要地复制它们,最终得到一个非常低效的写入循环。
确保你的代码遵循你的意图。 如果你不需要循环内的副本,不要做一个。
使用上面build议的参考&或者迭代器。