我有一个代码,我有两个选项,定义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;
}
}
答案 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,并且我避免过早地优化这种类型。