c++ - 在其他函数或循环中构造 lambda 时是否存在性能问题?

标签 c++ performance c++11 lambda anonymous-function

在 JavaScript 中,Mozilla recommends如果不需要闭包,则不应在其他函数内创建函数,因为这会对脚本性能产生负面影响。在 JavaScript 中,同样的问题也适用于在循环内创建函数。同样的问题是否适用于 C++ lambda?

例如,这两个函数之间是否存在性能差异:

int f1(vector<int> v) {
    for_each(v.begin(), v.end(), [](int i) { cout << i << endl; });
}

auto print_int = [](int i) { cout << i << endl; };
int f2(vector<int> v) {
    for_each(v.begin(), v.end(), print_int);
}

我想是的,这些问题适用于 C++,f2 的性能将优于 f1;但是,我还没有找到明确的答案。

最佳答案

不,是的。

对于简单的 lambda 表达式,这无关紧要。这是因为 lambda 是带有 operator() 的类的简单简写。

相关元素是该类具有构造函数。想象一下:

std::map<std::string, std::string> m = create();
auto lambda = [m]() { /* code */ };

在循环中执行此捕获没有意义,因为您复制了很多不应更改的字符串。 在这种情况下,通过引用捕获也可能有意义。

我的建议是:和其他类(class)一样。如果构建起来很简单,只需将其放置在您认为合乎逻辑的位置即可。如果 build 成本高,想想为什么这么贵,并考虑在可能的情况下将其搬走。

关于c++ - 在其他函数或循环中构造 lambda 时是否存在性能问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55714369/

相关文章:

c++ - gnuplot: multimap 缩放

performance - Scala 有状态 Actor ,递归调用比使用 vars 更快?

css - 在 vue 中的单页应用程序中对抗无样式文本的闪烁

c++ - 如何将字符插入集合?

c++ - QNetworkAccessManager 多次上传失败

c++ - shared_ptr 模板参数无效

C++ 静态初始化顺序

android - Android 模拟器性能与真实设备性能相比如何?

c++ - 移动构造函数是自动生成的吗?

c++ - 关于在 CentOS-6.5 上安装 gcc-6.* 的问题