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

C++函数传值与传引用对比分析

在C++编程中,函数参数传递的方式直接影响程序的性能、内存管理以及代码逻辑的正确性。传值(Pass by Value)传引用(Pass by Reference)是两种最常用的参数传递方式,它们各有优缺点,适用于不同的场景。本文将从拷贝行为、性能影响、数据修改权限、多态支持等方面进行对比分析,帮助开发者合理选择参数传递方式。


1. 核心机制对比

(1)传值:副本操作

  • 机制:函数调用时,实参的值会被拷贝到形参,形成独立的副本。
  • 特点
    • 函数内部对形参的修改不影响原始数据。
    • 适用于小型数据(如基本类型 intdouble)或无需修改实参的场景。

示例

void increment(int a) { a++; }  // 修改的是副本,不影响实参
int main() {int x = 5;increment(x);  // x 仍为 5
}

(2)传引用:别名操作

  • 机制:形参是实参的别名,直接操作原对象,无数据拷贝
  • 特点
    • 函数内部对形参的修改直接影响实参。
    • 适用于大型对象(如结构体、类)或需要修改实参的场景。

示例

void increment(int& a) { a++; }  // 修改的是实参本身
int main() {int x = 5;increment(x);  // x 变为 6
}

2. 关键差异分析

(1)性能影响

传递方式拷贝开销适用场景
传值高(大型对象)基本类型、小型数据
传引用大型对象、避免拷贝
  • 传值在传递大型对象(如 std::vector)时,会触发拷贝构造函数,导致额外开销。
  • 传引用(尤其是 const 引用)能避免拷贝,提升效率。

(2)数据修改权限

传递方式能否修改实参典型用途
传值不能保护原始数据
传引用能(除非 const需要修改实参
  • const 引用允许函数修改实参,适用于 swap、数据更新等操作。
  • const 引用提供只读访问,适用于避免拷贝但不允许修改的情况。

(3)多态性与对象切片

  • 传值
    • 如果参数是基类类型,传递派生类对象时会发生对象切片(丢失派生类信息)。
    void process(Base obj) {}  // 传入Derived对象时,仅保留Base部分
    
  • 传引用
    • 支持多态,可通过基类引用或指针调用派生类方法(需虚函数支持)。
    void process(Base& obj) { obj.virtualMethod(); }  // 正确调用派生类方法
    

(4)类型安全与 const 限定

  • 传值
    • 允许隐式类型转换(如 doubleint)。
    • const 对形参无约束(副本可随意修改)。
  • 传引用
    • 需要严格类型匹配(除非是 const 引用)。
    • const 引用不能绑定到临时对象,而 const 引用可以。
    void foo(const std::string& s) {}  // 可接受临时对象
    void bar(std::string& s) {}        // 编译错误(临时对象不能绑定)
    

3. 最佳实践

(1)何时使用传值?

  • 传递基本类型intfloat 等)。
  • 需要保护原始数据不被修改
  • 函数内部仅需副本,不影响外部状态。

(2)何时使用传引用?

  • 需要修改实参(非 const 引用)。
  • 传递大型对象(如 std::vector、自定义类)以避免拷贝
  • 实现多态(基类引用处理派生类对象)。

(3)推荐模式

  • 输入参数:优先使用 const &(避免拷贝,且防止修改)。
    void print(const std::vector<int>& data);  // 只读访问
    
  • 输出参数:使用非 const &(允许修改实参)。
    void updateCounter(int& count);  // 需要修改外部变量
    
  • 小型数据:直接传值(如 intbool)。

4. 总结

特性传值传引用
拷贝行为有拷贝,独立副本无拷贝,直接操作原对象
性能低效(大型对象)高效
修改权限不能修改实参可修改(除非 const 引用)
多态支持不支持(对象切片)支持
适用场景基本类型、保护数据大型对象、需修改实参、多态

合理选择传值或传引用,能显著提升代码的性能安全性。对于现代C++,还可结合移动语义(std::move完美转发进一步优化参数传递,但理解基础机制仍是关键。

相关文章:

C++函数传值与传引用对比分析

在C编程中&#xff0c;函数参数传递的方式直接影响程序的性能、内存管理以及代码逻辑的正确性。传值&#xff08;Pass by Value&#xff09;和传引用&#xff08;Pass by Reference&#xff09;是两种最常用的参数传递方式&#xff0c;它们各有优缺点&#xff0c;适用于不同的场…...

【se-res模块学习】结合CIFAR-10分类任务学习

继CIFAR-10图像分类&#xff1a;【Res残差连接学习】结合CIFAR-10任务学习-CSDN博客 再优化 本次训练结果在测试集上的准确率表现可达到90%以上 1.训练模型&#xff08;MyModel.py&#xff09; import torch import torch.nn as nnclass SENet(nn.Module): # SE-Net模块def…...

二元随机响应(Binary Randomized Response, RR)的翻转概率

随机响应&#xff08;Randomized Response&#xff09;机制 ✅ 回答核心&#xff1a; p 1 1 e ε 才是「翻转概率」 \boxed{p \frac{1}{1 e^{\varepsilon}}} \quad \text{才是「翻转概率」} p1eε1​​才是「翻转概率」 而&#xff1a; q e ε 1 e ε 是「保留真实值」…...

湖北理元理律师事务所:债务优化中的“生活保障”方法论

债务危机往往伴随生活质量骤降&#xff0c;如何在还款与生存间找到平衡点&#xff0c;成为债务优化的核心挑战。湖北理元理律师事务所基于多年实务经验&#xff0c;提出“双轨并行”策略&#xff1a;法律减负与生活保障同步推进。 债务优化的“温度法则” 1.生存资金预留机制…...

RFID智能书柜:精准定位,找书告别 “大海捞针”

在传统图书馆的浩瀚书海&#xff0c;找书无异于在错综复杂的迷宫里徘徊。读者在书架间来回奔波&#xff0c;耗费大量时间精力&#xff0c;还常一无所获。RFID智能书柜的出现&#xff0c;彻底改写了这一局面。它搭载的RFID读写器与天线协同工作&#xff0c;能实时精准定位贴有RF…...

视觉图像处理及多模态融合初探

(一)指标汇总 1. 图像采集与质量提升 指标描述可能的量化值图像清晰度反映图像中物体的边缘和细节的清晰程度例如:1-10 分(1 为极不清晰,10 为非常清晰)噪声水平表示图像中随机噪声的多少例如:噪声强度百分比(0%-100%)畸变程度描述图像中物体形状的变形程度例如:畸变…...

射频前端模组芯片(PA)三伍微电子GSR2337 兼容替代SKY85337, RTC7646, KCT8247HE

射频前端模组芯片&#xff08;PA&#xff09;三伍微电子GSR2337 兼容替代SKY85337, RTC7646, KCT8247HE 型号GSR2337 ‌频率‌: 2.4 GHz ‌类型‌: FEM (PALNASW) ‌WIFI‌: 11n/ac/ax ‌功率‌: 21dBmEVM-43dB5V ‌封装‌: 3*3 mm ‌电压‌: 3.3V & 5V ‌P2P‌: SKY85…...

python 接收c++的.so传的jsoncpp字符串

叮&#xff01;快来看看我和文心一言的奇妙对话&#xff5e;点击链接 https://yiyan.baidu.com/share/57o6vGa3GY -- 文心一言&#xff0c;既能写文案、读文档&#xff0c;又能绘画聊天、写诗做表&#xff0c;你的全能伙伴&#xff01; 要从 C 动态链接库 (.so 文件) 中接收 JS…...

EasyRTC嵌入式音视频通话SDK驱动智能硬件音视频应用新发展

一、引言 在数字化浪潮下&#xff0c;智能硬件蓬勃发展&#xff0c;从智能家居到工业物联网&#xff0c;深刻改变人们的生活与工作。音视频通讯作为智能硬件交互与协同的核心&#xff0c;重要性不言而喻。但嵌入式设备硬件资源受限&#xff0c;传统音视频方案集成困难。EasyRT…...

Day19 常见的特征筛选算法

常见的特征筛选算法 1. 方差筛选 原理 &#xff1a;方差衡量的是数据的离散程度。在特征筛选中&#xff0c;如果某个特征的方差很小&#xff0c;说明该特征在不同样本上的值差异不大&#xff0c;那么它对模型的区分能力可能很弱。方差筛选就是通过设定一个方差阈值&#xff0…...

如何使用极狐GitLab 软件包仓库功能托管 terraform?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 Terraform 模块库 (BASIC ALL) 基础设施仓库和 Terraform 模块仓库合并到单个 Terraform 模块仓库功能引入于极狐GitLab 15.1…...

15前端项目----用户信息/导航守卫

登录/注册 持久存储用户信息问题 退出登录导航守卫解决问题 持久存储用户信息 本地存储&#xff1a;&#xff08;在actions中请求成功时&#xff09; 添加localStorage.setItem(token,result.data.token);获取存储&#xff1a;&#xff08;在user仓库中&#xff0c;state中tok…...

重定向及基础实验

1.if指令 if (判断条件){ 执行语句; } if的正则表达式 #比较变量和字符串是否相等&#xff0c;相等时if指令认为该条件为true&#xff0c;反之为false ! #比较变量和字符串是否不相等&#xff0c;不相等时if指令认为条件为true&#xff0c;反之为false ~ #区分大小写字符&…...

CBO和HBO区别及介绍

CBO&#xff08;Cost-Based Optimizer&#xff09;和 HBO&#xff08;Heuristic-Based Optimizer&#xff09;是两种数据库查询优化器的类型&#xff0c;它们在优化策略和实现方式上有显著的区别。以下是详细的解释和对比&#xff1a; 1. CBO&#xff08;Cost-Based Optimizer…...

华为HCIP-AI认证考试版本更新通知

​华为HCIP-AI认证考试版本更新通知​ ​HCIP-AI-EI Developer V2.5认证发布​ 华为官方宣布&#xff0c;​HCIP-AI-EI Developer V2.5认证考试将于2025年3月31日正式上线。新版认证聚焦AI工程化开发与行业实践&#xff0c;新增大模型部署优化、AI边缘计算等前沿技术内容&…...

【算法-链表】链表操作技巧:常见算法

算法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;双指针滑动窗口二分查找前缀和位运算模拟 链表是一种灵活的数据结构&#xff0c;广泛用于需要频繁插入和删除的场景。掌握链表的常见操作技巧&#xff0c;如插入、删除、翻转和合并等&#xff0c;能帮助开发者更…...

【探寻C++之旅】第十三章:红黑树

请君浏览 前言1. 红黑树的概念1.2 红黑树的规则1.3 红黑树如何确保最长路径不超过最短路径的两倍&#xff1f;1.4 红黑树的效率 2. 红黑树的实现2.1 红黑树的结构2.2 红黑树的插入情况1&#xff1a;变色情况2&#xff1a;单旋变色情况2&#xff1a;双旋变色代码演示 2.3 红黑树…...

JavaScript 性能优化全攻略:从基础到实战

引言 在现代 Web 开发中,JavaScript 作为核心语言,其性能直接影响用户体验。无论是单页应用(SPA)还是复杂交互页面,性能优化始终是开发者关注的核心。 本文将从基础策略、最新技巧、常见误区和实战案例四个维度,系统性地解析 JavaScript 性能优化的关键方法,并提供可复…...

Kafka消息队列之 【消费者分组】 详解

消费者分组(Consumer Group)是 Kafka 提供的一种强大的消息消费机制,它允许多个消费者协同工作,共同消费一个或多个主题的消息,从而实现高吞吐量、可扩展性和容错性。 基本概念 消费者分组:一组消费者实例的集合,这些消费者实例共同订阅一个或多个主题,并通过分组来协调…...

HuggingFace与自然语言处理(从框架学习到经典项目实践)[ 01 API操作 ]

本教程适用与第一次接触huggingface与相应框架和对nlp任务感兴趣的朋友&#xff0c;该栏目目前更新总结如下&#xff1a; ​​Tokenizer​​&#xff1a; 支持单句/双句编码&#xff0c;自动处理特殊符号和填充。 批量编码提升效率&#xff0c;适合训练数据预处理。Datasets​…...

uniapp-文件查找失败:‘@dcloudio/uni-ui/lib/uni-icons/uni-icons.vue‘

uniapp-文件查找失败&#xff1a;‘dcloudio/uni-ui/lib/uni-icons/uni-icons.vue’ 今天在HBuilderX中使用uniapp开发微信小程序时遇到了这个问题&#xff0c;就是找不到uni-ui组件 当时创建项目&#xff0c;选择了一个中间带的底部带选项卡模板&#xff0c;并没有选择内置u…...

springboot+vue实现在线网盘(云盘)系统

今天教大家如何设计一个网盘&#xff08;云盘&#xff09;系统系统 , 基于目前主流的技术&#xff1a;前端vue&#xff0c;后端springboot。 同时还带来的项目的部署教程。 视频演示 springbootvue实现在线网盘&#xff08;云盘&#xff09;系统 图片演示 一. 系统概述 用过百…...

启智平台调试 qwen3 4b ms-swift

以上设置完成后&#xff0c;我们点击新建任务。等待服务器创建和分配资源。 资源分配完成后我们看到如下列表&#xff0c;看到资源running状态&#xff0c;后面有一个调试按钮&#xff0c;后面就可以进入代码调试窗体界面了。 点击任务名称 跳转 访问github失败 加速器开启…...

KAXA凯莎科技AGV通信方案如何赋能智能仓储高效运作?

AGV智慧物流系统融合了先进的自动导航技术和智能控制算法&#xff0c;通过激光雷达、摄像头、激光传感器等多种感知设备&#xff0c;实现仓库内的精准定位与自主导航。系统具备环境实时感知能力&#xff0c;能够动态避障&#xff0c;并基于任务调度智能规划最优路径&#xff0c…...

【AI提示词】费曼学习法导师

提示说明 精通费曼学习法的教育专家&#xff0c;擅长通过知识解构与重构提升学习效能。 提示词 Role: 费曼学习法导师 Profile language: 中文description: 精通费曼学习法的教育专家&#xff0c;擅长通过知识解构与重构提升学习效能background: 认知科学硕士背景&#xff0…...

体绘制中的传输函数(transfer func)介绍

文章目录 VTK volume不透明度传输函数梯度不透明度传输函数颜色传输函数VTK volume VTK (Visualization Toolkit) 中的 Volume(体积)是一个重要的概念,特别是在处理和可视化三维数据时。以下是 VTK Volume 的一些关键概念: 定义: Volume 在 VTK 中代表一个三维数据集,通…...

Algolia - Docsearch的申请配置安装【以踩坑解决版】

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…...

【文档智能】开源的阅读顺序(Layoutreader)模型使用指南

一年前&#xff0c;笔者基于开源了一个阅读顺序模型&#xff08;《【文档智能】符合人类阅读顺序的文档模型-LayoutReader及非官方权重开源》&#xff09;&#xff0c; PDF解析并结构化技术路线方案及思路&#xff0c;文档智能专栏 阅读顺序检测旨在捕获人类读者能够自然理解的…...

现在的AI应用距离通用agent差的那点儿意思

现在的AI应用距离通用Agent差的那点儿意思 引言&#xff1a;从"生成力"到"行动力" 当前AI应用最显著的进步体现在内容生成能力上——无论是ChatGPT的流畅对话&#xff0c;还是Midjourney的惊艳画作&#xff0c;都展示了强大的生成力。然而&#xff0c;正…...

LeetCode 热题 100 238. 除自身以外数组的乘积

LeetCode 热题 100 | 238. 除自身以外数组的乘积 大家好&#xff0c;今天我们来解决一道经典的算法问题——除自身以外数组的乘积。这道题在 LeetCode 上被标记为中等难度&#xff0c;要求在不使用除法的情况下&#xff0c;计算数组中每个元素的乘积&#xff0c;其中每个元素的…...

分享 2 款基于 .NET 开源的实时应用监控系统

前言 在现代软件开发和运维管理中&#xff0c;实时应用监控系统扮演着至关重要的角色。它们能够帮助开发者和运维人员实时监控应用程序的状态&#xff0c;及时发现并解决问题&#xff0c;从而确保应用的稳定性和可靠性。今天大姚给大家分享 2 款基于.NET 开源的实时应用监控系…...

使用pytorch保存和加载预训练的模型方法

需要使用到的函数 在 PyTorch 中&#xff0c;torch.save() 和 torch.load() 是用于保存和加载模型的核心函数。 torch.save() 函数 主要用途&#xff1a;将模型或模型的状态字典&#xff08;state_dict&#xff09;保存到文件中。 语法&#xff1a; torch.save(obj, f, pi…...

Linux/AndroidOS中进程间的通信线程间的同步 - 消息队列

本文介绍消息队列&#xff0c;它允许进程之间以消息的形式交换数据。数据的交换单位是整个消息。 POSIX 消息队列是引用计数的。只有当所有当前使用队列的进程都关闭了队列之后才会对队列进行标记以便删除。POSIX 消息有一个关联的优先级&#xff0c;并且消息之间是严格按照优…...

DNA Launcher:打造个性化安卓桌面,开启全新视觉体验

DNA Launcher是一款专为安卓手机设计的桌面美化软件&#xff0c;旨在为用户提供丰富多样的桌面美化选项和全新的操作逻辑。通过这款软件&#xff0c;用户可以轻松调整桌面布局、更换主题、添加个性化元素&#xff0c;打造出独一无二的手机桌面。它支持多分辨率重新布局&#xf…...

Flink SQL DataStream 融合开发模式与动态配置热加载机制实战

一、为什么需要 SQL 与 DataStream 融合开发? 在实时数仓构建中,Flink SQL 的易用性和声明式优势广受欢迎;但遇到业务逻辑复杂、需要灵活控制时,DataStream API 提供了不可替代的灵活性。 而现实中,我们常常遇到如下痛点: 场景问题解决方式多业务线、多个 Kafka Topic,…...

4.2java包装类

在 Java 里&#xff0c;基本数据类型不具备对象的特性&#xff0c;像不能调用方法、参与面向对象的操作等。为了让基本数据类型也能有对象的行为&#xff0c;Java 提供了对应的包装类。同时&#xff0c;自动拆箱和自动装箱机制让基本数据类型和包装类之间的转换更加便捷。 包装…...

在一台服务器上通过 Nginx 配置实现不同子域名访问静态文件和后端服务

一、域名解析配置 要实现通过不同子域名访问静态文件和后端服务&#xff0c;首先需要进行域名解析。在域名注册商或 DNS 服务商处&#xff0c;为你的两个子域名 blog.xxx.com 和 api.xxx.com 配置 A 记录或 CNAME 记录。将它们的 A 记录都指向你服务器的 IP 地址。例如&#x…...

C++23 views::as_rvalue (P2446R2) 深入解析

文章目录 引言C20 Ranges库回顾什么是Rangesstd::views的作用 views::as_rvalue 概述基本概念原型定义工作原理 应用场景容器元素的移动与其他视图适配器结合使用 总结 引言 在C的发展历程中&#xff0c;每一个新版本都会带来一系列令人期待的新特性&#xff0c;这些特性不仅提…...

Mockoon 使用教程

文章目录 一、简介二、模拟接口1、Get2、Post 一、简介 1、Mockoon 可以快速模拟API&#xff0c;无需远程部署&#xff0c;无需帐户&#xff0c;免费&#xff0c;跨平台且开源&#xff0c;适合离线环境。 2、支持get、post、put、delete等所有格式。 二、模拟接口 1、Get 左…...

15.thinkphp的上传功能

一&#xff0e;上传功能 1. 如果要实现上传功能&#xff0c;首先需要建立一个上传表单&#xff0c;具体如下&#xff1a; <form action"http://localhost/tp6/public/upload"enctype"multipart/form-data" method"post"><input type&…...

G口大带宽服务器线路怎么选

G口大带宽服务器线路选择指南 ​​一、线路类型与特点​​ ​​单线&#xff08;电信/联通/移动&#xff09;​​ ​​优势​​&#xff1a;带宽独享、价格低、延迟稳定&#xff0c;适合单一运营商用户集中场景。​​劣势​​&#xff1a;跨运营商访问延迟高&#xff08;如电信…...

低秩适应(LoRA)与量化LoRA(QLoRA)技术解析

LoRA&#xff1a;从线性代数到模型微调 从矩阵分解理解Lora 假设我们有一个大模型中的权重矩阵&#xff0c;形状为1024512&#xff08;包含约52万个参数&#xff09;。传统微调方法会直接更新这52万个参数&#xff0c;这不仅计算量大&#xff0c;而且存在过拟合风险。 LoRA的…...

Webug4.0靶场通关笔记22- 第27关文件包含

目录 一、文件包含 1、原理分析 2、文件包含函数 &#xff08;1&#xff09;include( ) &#xff08;2&#xff09;include_once( ) &#xff08;3&#xff09;require( ) &#xff08;4&#xff09;require_once( ) 二、第27关渗透实战 1、打开靶场 2、源码分析 3、…...

OpenCV CPU性能优化

OpenCV 在 CPU 上的性能优化涉及多个层次&#xff0c;从算法选择到指令级优化。以下是系统的优化方法和实践技巧&#xff1a; 一、基础优化策略 1. 内存访问优化 连续内存布局&#xff1a;优先使用 cv::Mat::isContinuous() 检查 cpp if(mat.isContinuous()) {// 可优化为单循…...

OpenCV进阶操作:图像的透视变换

文章目录 前言一、什么是透视变换&#xff1f;二、透视变换的过程三、OpenCV透视变换核心函数四、文档扫描校正&#xff08;代码&#xff09;1、预处理2、定义轮廓点的排序函数3、定义透视变换函数4、读取原图并缩放5、轮廓检测6、绘制最大轮廓7、对最大轮廓进行透视变换8、旋转…...

MySQL事务隔离机制与并发控制策略

MySQL事务隔离机制与并发控制策略 MySQL事务隔离机制与并发控制策略一、数据库并发问题全景解析二、事务隔离级别深度解析三、MySQL并发控制核心技术1. 多版本并发控制&#xff08;MVCC&#xff09;2. 锁机制 四、隔离级别实现差异对比五、生产环境最佳实践六、高级优化技巧七、…...

【算法学习】递归、搜索与回溯算法(二)

算法学习&#xff1a; https://blog.csdn.net/2301_80220607/category_12922080.html?spm1001.2014.3001.5482 前言&#xff1a; 在&#xff08;一&#xff09;中我们挑了几个经典例题&#xff0c;已经对递归、搜索与回溯算法进行了初步讲解&#xff0c;今天我们来进一步讲解…...

SpringBoot整合PDF导出功能

在实际开发中&#xff0c;我们经常需要将数据导出为PDF格式&#xff0c;以便于打印、分享或存档。SpringBoot提供了多种方式来实现PDF导出功能&#xff0c;下面我们将介绍其中的一些。 HTML 模板转 PDF&#xff08;推荐&#xff09; 通过模板引擎&#xff08;如 Thymeleaf 或…...

关于MySQL 数据库故障排查指南

&#x1f6e0; MySQL 数据库故障排查指南 目标&#xff1a;解决常见数据库问题&#xff0c;保障数据安全与系统稳定运行。 一、常见故障类型概览 故障类型可能原因排查/解决步骤无法连接服务未启动、端口未监听、用户权限不足 查看服务状态&#xff1a; systemctl status my…...

ubuntu yolov5(c++)算法部署

1.安装onnx 1.15.0 首先使用如下命令关闭 anaconda 对后续源码编译的影响&#xff1b; # 禁用当前 conda 环境 conda deactivate# 确保 conda 初始化脚本不会自动激活 base 环境 conda config --set auto_activate_base false# 然后重新打开终端或执行 source ~/.bashrc 1.安…...