当前位置: 首页 > news >正文

wordpress手机端菜单广州网站优化方案

wordpress手机端菜单,广州网站优化方案,做单页网站盈利案例,网站空间 虚拟主机C的lambda表达式原理 1 简介在 C11 标准中,引入了 Lambda 表达式这一重要特性,为开发者提供了更简洁、灵活的编程方式。Lambda 表达式,也被称为匿名函数,允许在代码中直接定义一个可调用的代码单元,而无需显式地定义一…

C++的lambda表达式原理

1 简介

  在 C++11 标准中,引入了 Lambda 表达式这一重要特性,为开发者提供了更简洁、灵活的编程方式。Lambda 表达式,也被称为匿名函数,允许在代码中直接定义一个可调用的代码单元,而无需显式地定义一个命名函数。这一特性极大地增强了 C++ 的表达能力,尤其在函数式编程和算法应用中发挥了重要作用。本文将深入探讨 C++ Lambda 表达式的语法、特性、应用场景以及其背后的实现原理。

  ambda 表达式可以理解为一个匿名的内联函数,它具有一个返回类型、一个参数列表和一个函数体。与普通函数不同的是,Lambda 表达式通常使用尾置返回类型。其基本语法形式如下:

[capture list](parameter list) -> return type { function body }
  • capture list:捕获列表,用于指定 Lambda 表达式所在函数中定义的局部变量列表,这些变量可以在 Lambda 表达式内部使用。​捕获可以进行值捕获,引用捕获,可变捕获,以及前几种的混合捕获。
  • parameter list:参数列表,与普通函数的参数列表类似,用于接收调用时传递的参数。​
  • return type:返回类型,指定 Lambda 表达式的返回值类型。在某些情况下,编译器可以自动推断返回类型,此时可以省略该部分。​
  • function body:函数体,包含了 Lambda 表达式实际执行的代码逻辑。
std::vector<int> numbers = {5, 2, 8, 1, 9};
std::sort(numbers.begin(), numbers.end(), [](int a, int b) { return a < b; });
for (int num : numbers) {std::cout << num << " "; // 输出:1 2 5 8 9
}

2 原理

  当编写一个 Lambda 表达式时,编译器会将其转换为一个未命名类的未命名对象,这个类重载了函数调用运算符operator()。例如,考虑以下 Lambda 表达式:

int main(){auto lambda = [](int a, int b) { return a + b; };lambda(1,2);
}

  编译器大致会将其转换为类似如下的代码。可以看到主要就是创建了一个匿名类并且重载类对应的operator()函数,同时重载operator*__invoke函数提供了一种方式,使得 lambda 表达式可以被转换为函数指针类型。这对于需要将 lambda 作为参数传递给接受函数指针的函数非常重要。例如,某些标准库函数或算法可能需要一个函数指针作为参数。

int main()
{class __lambda_3_19{public: inline /*constexpr */ int operator()(int a, int b) const{return a + b;}using retType_3_19 = int (*)(int, int);inline constexpr operator retType_3_19 () const noexcept{return __invoke;};private: static inline /*constexpr */ int __invoke(int a, int b){return __lambda_3_19{}.operator()(a, b);}};__lambda_3_19 lambda = __lambda_3_19{};lambda.operator()(1, 2);return 0;
}

值捕获
编译器会为捕获的变量在匿名类中创建相应的数据成员,并在构造函数中使用捕获变量的值进行初始化。例如:

int main(){int a = 1;int b = 2;auto lambda = [=]() { return a + b; };lambda();
}

  对应生成的代码中添加了两个成员,并且在匿名类初始化时初始化这两个成员。

int main()
{int a = 1;int b = 2;class __lambda_5_19{public: inline /*constexpr */ int operator()() const{return a + b;}private: int a;int b;public:__lambda_5_19(int & _a, int & _b): a{_a}, b{_b}{}};__lambda_5_19 lambda = __lambda_5_19{a, b};lambda.operator()();return 0;
}

引用捕获
引用捕获同理,区别是成员变成了引用。

int main(){int a = 1;int b = 2;auto lambda = [&]() { return a + b; };lambda();
}
int main()
{int a = 1;int b = 2;class __lambda_5_19{public: inline /*constexpr */ int operator()() const{return a + b;}private: int & a;int & b;public:__lambda_5_19(int & _a, int & _b): a{_a}, b{_b}{}};__lambda_5_19 lambda = __lambda_5_19{a, b};lambda.operator()();return 0;
}

3 使用lambda需要注意的点

  使用lambda时需要注意

  1. 捕获的变量的生命周期,捕获的变量在 lambda 执行时必须有效。如果 lambda 的生命周期超过了捕获变量的有效性,将导致未定义行为。
  2. 尽管 lambda 通常是轻量级的,但如果捕获的变量较多或较复杂,可能会导致额外的内存开销。在性能关键的场景中,要注意这一点。
http://www.dtcms.com/a/407102.html

相关文章:

  • PostgreSQL表分区简单介绍和操作方法
  • 建设网站费用评估浙江省特种作业证查询官网
  • Charles在安全测试中的应用,接口漏洞验证与敏感数据检测
  • NAT、代理服务与内网穿透详解
  • 为什么有时候 reCAPTCHA 通过率偏低,常见原因有哪些
  • 外出也能随时 SSH 访问内网 Linux,ZeroNews 提供公网域名直达
  • 基于vue的咖啡销售系统28zz1(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
  • LoadBalancer完整学习笔记:简介、原理与自定义
  • 网站建设英文怎么说洛阳php网站开发
  • 图片转文字(PDF转word,图片转word等)
  • 网站维护一年多少费北京网站建设培训
  • 让风恒定:在 unordered 的荒原上种下一棵常数级的树
  • 图书网站建设实训总结前端培训心得
  • 【Spring Cloud Alibaba】Seata(一)
  • 仓颉编程语言的stdx包介绍及使用
  • 长沙网站制作方法wordpress获得所有分类
  • 无限空间 网站网站新闻页面无法翻页
  • 民族团结 网站建设wordpress底部版权插件
  • Markdown转PDF工程化实现含图片支持与样式控制
  • Linux下安装Kafka 3.9.1
  • kafka vs rocketmq
  • 1.DHCP服务器
  • 河南网站备案代理苏州专业网站建设公司
  • 电商网站seo公司网页怎么做成网站
  • 与TCP相比,UDP有什么优缺点?
  • 从0到1制作一个go语言服务器 (一) 配置
  • 沙姆定律原理/公式推导
  • leetcode 98 验证二叉搜索树
  • 国外外包网站天津百度搜索排名优化
  • 中国建设银行网站企业网银收费怎么在外国网站上找产品做跨境电商