C++知识补充(一)

C++知识补充

由于之前有系统的学过 C 语言,现在在学习 C++ 的过程中采用的是对比学习方式,C 语言中没有涉及到的会补充记录一下。

内联函数

内联函数(Inline Function)是 C++ 中一种特殊的函数,其定义直接在每个调用点展开,这意味着编译器会尝试将函数调用替换为函数本身的代码,这样可以减少函数调用的开销,尤其是在小型函数中。

特点

  1. 减少函数调用开销:内联函数通常用于优化小型、频繁调用的函数,因为它断免了函数调用的常规开销(如参数传递、栈操作等)。
  2. 编译器决策:即使函数被声明为内联,编译器也可能决定不进行内联,特别是对于复杂或递归函数。
  3. 适用于小型函数:通常只有简单的、执行时间短的函数适合做内联。
  4. 定义在每个使用点:内联函数的定义(而非仅仅是声明)必须对每个使用它的文件都可见,通常意味着将内联函数定义在头文件中。

使用方法

通过在函数声明前添加关键字 inline 来指示编译器该函数适合内联

inline int max(int x, int y)
{return x > y ? x : y;
}
#include <iostream>inline int add(int a, int b)
{return a + b;
}
int main()
{int result = add(5,3);// 编译器可能会将此替换为:int result = 5 + 3;std::cout << "Result:" << result << std::endl;return 0;    
}
// 在这个示例中,函数 add 被定义为内联函数。当它被调用时,编译器可能会将函数调用替换为函数体内的代码。

注意事项

  1. 过度使用的风险:不应滥用内联函数,因为这可能会增加最终程序的大小(代码膨胀),对于大型的函数或递归函数,内联可能导致性能下降。
  2. 编译器的决定:最终是否将函数内联是由编译器决定的,即使函数被标记为 inline。
  3. 适用场景:最适合内联的是小型函数和在性能要求高的代码中频繁调用的函数。

内联函数是一种用于优化程序性能的工具,但需要合理使用,以确保代码的可维护性和性能的平衡。

Lambda表达式

Lambda 表达式是 C++11引入的一种匿名函数的方式,它允许你在需要函数的地方内联地定义函数,而无需单独命名函数。
Lambda表达式的基本语法如下:

[capture clause](parameters) -> return_type
{// 函数体// 可以使用捕获列表中的变量return expression; // 可选返回语句
}

Lambda 表达式由以下部分组成:

  1. 捕获列表(Capture clause):用于捕获外部变量,在Lambda 表达式中可以访问这些变量,捕获列表可以为空,也可以包含变量列表[var1,var2, …]。
  2. 参数列表(Parameters):与普通函数的参数列表类似,可以为空或包含参数列表(param1,param2,…)。
  3. 返回类型(Return type):Lambda 表达式可以自动推断返回类型,也可以显式指定返回类型 -> return_type。如果函数体只有一条返回语句,可以省略返回类型。
  4. 函数体(Body):Lambda 表达式的函数体,包含需要执行的代码。

Lambda表达式最简单的案例是在需要一个小型函数或临时函数时直接便用它,以下是一个非常简单的例子,其中使用Lambda 表达式来定义一个加法操作,并立即使用它来计算两个数的和。

// 使用 Lambda 表达式进行加法
#include <iostream>int main()
{int x = 50;int y = 20;auto add = [](int a, int b) -> int{return a + b;};int ret = add(x, y);std::cout << ret;return 0;
}
// 使用匿名 Lambda 函数来返回两个数中较大的数
#include <iostream>using namespace std;//bool compare(int a, int b)
//{
//    return a > b;
//}int getMax(int a, int b, bool (*pcompare)(int a, int b))
{if(pcompare(a, b)){return a;}else{return b;}
}int main()
{int x = 30;int y = 20;// int max = getMax(x, y, compare);// 下面改写为 Lambda 表达式int max = getMax(x, y, [](int a, int b) -> bool{return a > b;});cout << max << endl;return 0;
}

带参数捕获的 Lambda 表达式

#include <iostream>using namespace std;int main()
{int x = 10;int y = 20;auto add = [x, y]() -> int{// x++;// x = 15; 这种方式捕获,不能修改变量值,只能用(可读)return x + y;};int ret = add();cout << ret << endl;int z = 5;auto mul = [=]() -> int{// x++;// x = 15; 这种方式捕获所有变量,不需要去列表中写明,不能修改变量值,只能用(可读)return x * y * z;};ret = mul();cout << ret << endl;// 用引用的方式捕获,引用类似指针,进行地址访问auto modifyMul = [&]() -> int{// x++;x = 15; // 引用的方式进行所有变量的捕获,可读可写(即可以修改变量的值)return x * y * z;};ret = modifyMul();cout << ret << endl;cout << "x = " << x << endl;return 0;
}
/*
第一个 Lambda 表达式  sum 按值捕获了 x 和 y (即它们的副本)。这意味 sum 内的 x 和 y 是在 Lambda 定义时的值的拷贝。
第二个 Lambda 表达式 mul使用 [=] 捕获列表,这表示它按值捕获所有外部变量。
第三个 Lambda 表达式 modifyMul使用 [&] 捕获列表,这表示它按引用捕获所有外部变量,因此,它可以修改 x 和 y 的原始值。
*/

这个示例展示了如何使用不同类型的捕获列表(按值和按引用)来控制 Lambda 表达式对外部变量的访问和修改。按值捕获是安全的,但不允许修改原始变量,而按引用捕获允许修改原始变量,但需要注意引用的有效性和生命周期问题。

Lambda 函数和内联函数在 C++ 中的相似之处和区别:

特性Lambda 函数内联函数
定义一种匿名函数,通常用于定义在需要他们的地方一种常规函数,通过 inline 关键字定义
用途提供一种快捷方式来定义临时的、小型的函数用于优化小型函数,减少函数调用的开销
语法使用 [capture] ( params ) { body }的形式定义使用常规函数定义语法,但在前边加上 inline 关键字
生命周期在定义他们的作用域内有效在整个程序执行期间有效
捕获外部变量可以捕获外部作用域中的变量(按值或按引用)不能直接捕获外部变量,只能通过参数传递
调用方式作为函数对象,可直接调用像普通函数一样调用
优化可以被编译器自动内联化,但取决于编译器优化策略明确请求编译器尝试内联,但实际内联化也取决于编译器
可见性通常只在定义他们的局部作用域内可见可以在定义它的任何作用域内可见
使用场景适合于一次性使用的场景,如作为回调、在算法中使用等适合于频繁调用的小型函数

虽然 Lambda 函数和内联函数在某些方面有相似之处,如它们都可以被编译器优化以减少调用开销,但它们在设计和用途上有明显的不同。Lambda 函数的核心优势在于它们的匿名性和对外部变量的捕获能力,而内联函数则主要关注于提高小型函数的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/625580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter 测试脚本录制器-HTTP 代理服务器

Jmeter 测试脚本录制器-HTTP 代理服务器 Jmeter 配置代理服务器代理服务器获取请求地址示例图配置步骤 浏览器配置代理Google 浏览器插件配置代理windows 本地网络配置代理 启动录制&#xff0c;生成证书生成证书导入证书Jmeter 配置证书 浏览器点击页面&#xff0c;录制请求地…

Linux笔记:Linux中的文件系统权限

在Red Hat Enterprise Linux 或其他类似的Linux发行版中&#xff0c;全局umask设置通常在几个不同的系统级配置文件中定义。以下是一些可能设置umask的地方&#xff1a; &#xff08;1&#xff09;/etc/profile: 这是为系统上的所有用户设置全局环境变量和启动程序的地方。通…

【算法与数据结构】343、LeetCode整数拆分

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;博主做这道题的时候一直在思考&#xff0c;如何找到 k k k个正整数&#xff0c; k k k究竟为多少合适。…

【Delphi 基础知识 19】Assigned的用法

在Delphi中&#xff0c;Assigned 是一个用于检查指针是否已分配内存的函数。它通常用于检查对象或指针是否已经被分配内存&#xff0c;以避免在未分配内存的情况下引用或操作它。 以下是 Assigned 的一些用法示例&#xff1a; 检查对象是否已分配内存&#xff1a; varMyObject…

linux终端查看文件

ls 命令&#xff1a;ls 命令用于列出当前目录下的文件和子目录。默认情况下&#xff0c;它以字母顺序列出文件和目录的名称。例如&#xff0c;要列出当前目录下的所有文件和目录&#xff0c;可以运行以下命令&#xff1a; ls ls -l 命令&#xff1a;ls -l 命令以长格式显示文件…

Nacos 高级详解

一 、服务集群 1 需求 服务提供者搭建集群 服务调用者&#xff0c;依次显示集群中各服务的信息 2 搭建 1&#xff09;修改服务提供方的controller&#xff0c;打印服务端端口号 package com.czxy.controller;import org.springframework.web.bind.annotation.*;import …

数据结构学习 jz39 数组中出现次数超过一半的数字

关键词&#xff1a;排序 摩尔投票法 摩尔投票法没学过所以没有想到&#xff0c;其他的都自己想。 题目&#xff1a;库存管理 II 方法一&#xff1a; 思路&#xff1a; 排序然后取中间值。因为超过一半所以必定在中间值是我们要的结果。 复杂度计算&#xff1a; 时间复杂度…

vtk9.3 关于vtk --- 来源于官方网站

Visualization Toolkit&#xff08;VTK&#xff09;是一个强大的开源软件系统&#xff0c;提供了在3D计算机图形学、图像处理、建模、体积渲染和科学可视化方面的高级功能。它提供了线程和分布式内存并行处理&#xff0c;以实现可伸缩性和更好的性能。 VTK 是一个跨平台库&…

大数据Doris(五十六):SQL函数之地理位置函数

文章目录 SQL函数之地理位置函数 一、​​​​​​​ST_AsText(GEOMETRY geo)

电阻表示方法和电路应用

电阻 电阻的表示方法 直标法 直标法是将电阻器的类别及主要技术参数的数值直接标注在电阻器表面上 通常用3位阿拉伯数字来标注片状电阻的阻值&#xff0c;其中第1位数代表阻值的第1位有效数&#xff1b;第2位数代表阻值的第二位有效数字&#xff1b;第3位数代表阻值倍率&…

L1-025 正整数A+B(Java)

题的目标很简单&#xff0c;就是求两个正整数A和B的和&#xff0c;其中A和B都在区间[1,1000]。稍微有点麻烦的是&#xff0c;输入并不保证是两个正整数。 输入格式&#xff1a; 输入在一行给出A和B&#xff0c;其间以空格分开。问题是A和B不一定是满足要求的正整数&#xff0…

Oracle常见操作

知识点1&#xff1a;格式化日期 select to_char(sysdate,yyyy-MM-dd HH:mm:ss) as time from dual;运行截图&#xff1a; 知识点2&#xff1a;解锁用户 alter user test account unlock;知识点3&#xff1a;修改密码 alter user test identified by test2;知识点4&#xff…

Java-String类-常见操作

1 需求 判断字符串是否为空 public boolean isEmpty()获取字符串的长度 public int length()去除首尾空格 public String trim()大小写切换 public String toLowerCase()public String toLowerCase(Locale locale)public String toUpperCase()public String toUpperCase(Local…

【分布式技术专题】「架构实践于案例分析」盘点互联网应用服务中常用分布式事务(刚性事务和柔性事务)的原理和方案

微服务架构的分布式事务解决方案 前提介绍知识系统回顾事务ACID事务的难点刚性事务和柔性事务 刚性事务优点局限 分布式事务全局事务&#xff08;DTP模型&#xff09;— 标准分布式事务全局事务(DTP模型) — XAXA接口的实现XA的2PC机制2PC机制的分析 2PC机制的局限 JavaEE平台中…

java-RateLimiter详解

一、RateLimiter的背景与重要性 在现代分布式系统和微服务架构中&#xff0c;限流是一种常见的保护机制。它能够防止过多的请求同时访问系统&#xff0c;从而导致系统过载、性能下降甚至服务不可用。Java作为企业级应用的主要编程语言之一&#xff0c;提供了多种限流方案&…

城市信息模型平台顶层设计与实践-CIM-读书笔记

城市信息模型平台顶层设计与实践-CIM-读书笔记 1、地理空间框架 GB/T 30317—2013《地理空间框架基本规定》规定地理空间框架为&#xff1a;“地理信息数据及其采集、加工、交换、服务所涉及的政策、法规、标准、技术、设施、机制和人力资源的总称&#xff0c;由基础地理信息…

小程序中使用微信同声传译插件实现语音识别、语音合成、文本翻译功能----语音合成(二)

官方文档链接&#xff1a;https://mp.weixin.qq.com/wxopen/plugindevdoc?appidwx069ba97219f66d99&token370941954&langzh_CN#- 要使用插件需要先在小程序管理后台的设置->第三方设置->插件管理中添加插件&#xff0c;目前该插件仅认证后的小程序。 语音合成…

排序算法之八:计数排序

1.计数排序思想 计数排序&#xff0c;顾名思义就是计算数据的个数 计数排序又称非比较排序 思想&#xff1a;计数排序又称为鸽巢原理&#xff0c;是对哈希直接定址法的变形应用。 操作步骤&#xff1a; 统计相同元素出现次数 根据统计的结果将序列回收到原来的序列中 计数…

HNU-算法设计与分析-实验2

算法设计与分析实验2 计科210X 甘晴void 202108010XXX 目录 文章目录 算法设计与分析<br>实验21 用动态规划法实现0-1背包问题重述想法代码验证算法分析 2 用贪心算法求解背包问题问题重述想法代码验证算法分析 3 半数集问题&#xff08;实现题2-3&#xff09;问题重述…

Ubuntu 22.04 安装Fail2Ban

Fail2Ban是一种用来防止暴力破解的工具&#xff0c;一般要和iptables配合使用。其原理是读取系统日志&#xff0c;并通过正则表达式匹配&#xff0c;监控IP在一段时间内的登录尝试、身份验证失败日志等并进行计数。超过阈值则进行IP封禁&#xff0c;过一段时间后再解封。 总的…