【问题标题】:Is using a getter in a for-each loop inefficient?在 for-each 循环中使用 getter 效率低吗?
【发布时间】:2015-03-03 04:48:56
【问题描述】:

最近我在我的代码中做了以下事情:

for(auto& item : something.getSomeVector())

当我开始优化过程时,我开始怀疑这是否比以下方法效率低:

std::vector<Type> vTypes = something.getSomeVector();
for(auto& item : vTypes)

for-each 循环会复制向量还是继续调用该函数?

谢谢!

【问题讨论】:

  • 我看不出编译器为什么不能优化它,但最简单的方法是编写基准测试,除非您更喜欢阅读程序集。
  • 进行测试或读取程序集...
  • 抱歉,这是什么程序集?谷歌只显示转换为汇编语言。

标签: c++ c++11 for-loop optimization foreach


【解决方案1】:

基于范围的循环的定义是您的代码在块内扩展为与此非常相似的内容:

auto && __range = something.getSomeVector();
auto __begin = begin(__range);
auto __end = end(__range);

for (; __begin != __end; ++__begin)
{
    auto &item = *__begin;

如您所见,它已经是最优的,您建议的改进甚至可能会使事情变得更糟(如果函数通过引用返回,那么您在以前没有制作过的地方复制了一份)。

【讨论】:

  • 与这个问题无关的小评论:它实际上定义为auto __begin = begin(__range), __end = end(__range);,这意味着两个迭代器被强制为相同的类型。
  • @5gon12eder 感谢您指出这一点。我以为我在澄清它,但忽略了细微差别(尽管理论上 endbegin 永远不应该得到不同的类型)
  • 是的,他们不应该。最近,当我认为我可以变得聪明并让 begin()end() 返回不同的类型时,我被这个咬了......
猜你喜欢
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
  • 2015-11-10
  • 1970-01-01
相关资源
最近更新 更多