c ++我应该在for循环中或在其中定义lambda以保持小范围,最佳做法是什么

时间:2016-07-11 13:20:08

标签: c++ c++11 lambda

我有一个代码,我有两个选项,定义lambda out of loop以节省lambda创建开销或在循环内定义它以保持小范围。

这个选择是否至关重要并会产生重大影响?

这两种选择的利弊是什么?

什么是最佳做法?

#include <iostream>
#include <string>
#include <vector>
#include <memory>

int main()
{
  std::vector<std::function<void()>> functors;
  auto func = [] () { std::cout << "Hello world I am doing some action"; };
  //some code here
  for(int i = 0; i < 100; ++i)
  {
      // some code here
      functors.push_back(func);
      // some code here
  }
}

已编辑:简化示例

int main()
{
  auto sum = [](const int x, const  int y) { return x + y; };
  for(int i = 0; i < 100; ++i)
  {
      std::cout << sum(i, i + 1) << std::endl;
  }
}

2 个答案:

答案 0 :(得分:9)

对于每个lambda表达式,编译器将为其创建一个operator ()重载的结构。每次控件通过lambda时都不会创建结构,因此就生成的代码而言,无论是在循环内部还是外部定义它都无关紧要。因此,保持本地化。

作为一般规则,不要过度思考这些虚幻的优化问题。最有可能的是,性能瓶颈将出现在算法复杂性中。

答案 1 :(得分:1)

我宁愿通过直接使用emplace_back删除副本构造并移动构造(在这种情况下不太有用,但根据经验,我应该尽可能地选择它):

#include <iostream>
#include <string>
#include <vector>
#include <memory>

int main()
{
    std::vector<std::function<void()>> functors;
    //some code here
    for(int i = 0; i < 100; ++i)
    {
        // some code here
        functors.emplace_back([] () { std::cout << "Hello world I am doing some action"; });
        // some code here
    }
}

那就是说,我同意@ArmenTsirunyan,并且我避免过早地优化这种类型。