首页 > 后端开发 > C++ > 正文

C++ lambda 表达式与闭包的性能分析

王林
发布: 2024-08-28 19:03:03
原创
605人浏览过

lambda 表达式和闭包在 c++++ 中会带来性能开销,原因如下:函数调用开销:lambda 表达式调用时,编译器必须生成函数调用,比直接调用命名的函数慢。捕获开销:如果 lambda 表达式捕获外部变量,则编译器必须创建和销毁闭包对象,产生内存和处理开销。

C++ lambda 表达式与闭包的性能分析

C++ lambda 表达式与闭包的性能分析

lambda 表达式和闭包

在 C++ 中,lambda 表达式是一种匿名函数,可以捕获来自包含范围的变量。它可以使用以下语法创建:

[capture list](parameters) -> return-type { function body }
登录后复制

当需要在函数或类外定义一个小型、一次性函数时,lambda 表达式非常有用。

闭包是将函数与其捕获的环境(变量)一起封装的结构。当闭包中的代码运行时,它可以访问这些捕获的变量,即使函数主体外部的范围不再存在。

立即学习C++免费学习笔记(深入)”;

性能开销

使用 lambda 表达式和闭包会带来一定的性能开销:

绘ai
绘ai

ai绘图提示词免费分享

绘ai 153
查看详情 绘ai
  • 函数调用开销:lambda 表达式被调用时,编译器必须生成一个与函数指针相类似的函数调用。这比直接调用命名的函数要慢一些。
  • 捕获开销:如果 lambda 表达式捕获了外部变量,则编译器必须在每次调用时创建和销毁一个闭包对象。这会产生一些内存开销和处理开销。

实战案例

我们可以使用基准测试来比较直接函数调用、lambda 表达式调用和闭包调用的性能。下面是 C++ 中的一个示例:

#include <benchmark/benchmark.h>

static void direct_function(int n) { }

static void lambda_expression(int n) {
  auto lambda = [](int n) { };
  lambda(n);
}

static void closure(int n) {
  int x = 0;
  auto lambda = [x](int n) { };
  lambda(n);
}

static void BM_direct_function(benchmark::State& state) {
  for (auto _ : state) {
    direct_function(state.range(0));
  }
}

static void BM_lambda_expression(benchmark::State& state) {
  for (auto _ : state) {
    lambda_expression(state.range(0));
  }
}

static void BM_closure(benchmark::State& state) {
  for (auto _ : state) {
    closure(state.range(0));
  }
}

BENCHMARK(BM_direct_function)->Arg(100)->Arg(1000)->Arg(10000);
BENCHMARK(BM_lambda_expression)->Arg(100)->Arg(1000)->Arg(10000);
BENCHMARK(BM_closure)->Arg(100)->Arg(1000)->Arg(10000);
登录后复制

运行基准测试会产生类似以下的结果:

调用方式 100k 调用 1M 调用 10M 调用
直接函数 0.02us 0.2us 2us
lambda 表达式 0.04us 0.4us 4us
闭包 0.08us 0.8us 8us

正如预期的那样,使用 lambda 表达式和闭包会增加函数调用的开销,特别是当捕获外部变量时。直接函数调用在所有情况下都具有最小的开销。

结论

在需要临时使用的小型函数的情况下,lambda 表达式非常方便。然而,如果您需要重复调用捕获外部变量的函数,那么创建闭包的开销可能很明显。在这种情况下,考虑使用显式函数或类方法可能更有效。

以上就是C++ lambda 表达式与闭包的性能分析的详细内容,更多请关注php中文网其它相关文章!

相关标签:
数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号