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

C++ 中值传参和引用传参

了解C++中的值传参和引用传参,我们从下面两个不同参数形式的方法展开说说void func(std::vector<int> v)void func(std::vector<int>& v) 的区别

这两个函数声明的主要区别在于参数传递方式:一个是按值传递,一个是按引用传递。以下是详细对比:

1. 按值传递 void func(std::vector<int> v)

1.1 特点

  • 创建副本:调用函数时会创建整个vector的完整副本
  • 不影响原vector:函数内对vector的修改不会影响调用者的原始数据
  • 性能开销:对于大型vector,复制所有元素会带来显著性能开销
  • 内存使用:需要额外内存存储副本

1.2 示例

void modifyCopy(std::vector<int> v) {v.push_back(100); // 只修改副本
}int main() {std::vector<int> nums = {1, 2, 3};modifyCopy(nums);// nums仍然是{1, 2, 3},未被修改
}

2. 按引用传递 void func(std::vector<int>& v)

2.1 特点

  • 无副本创建:传递的是原vector的引用(别名),不复制数据
  • 影响原vector:函数内对vector的修改会直接影响调用者的原始数据
  • 高性能:无论vector多大,传递成本都极低(只是一个引用/指针的开销)
  • 可能被修改:调用者需要意识到传入的数据可能被修改

2.2 示例

void modifyOriginal(std::vector<int>& v) {v.push_back(100); // 修改原始vector
}int main() {std::vector<int> nums = {1, 2, 3};modifyOriginal(nums);// nums现在是{1, 2, 3, 100}
}

3.关键区别对比表

特性按值传递 func(vector<int> v)按引用传递 func(vector<int>& v)
数据复制是(完整复制)否(仅传递引用)
修改影响原数据
性能低(大型vector开销大)高(恒定开销)
内存使用需要额外内存不需要额外内存
const安全性自动保护原数据需要显式使用const保护
适用场景需要独立副本时避免复制或需要修改原数据时

4.进阶考虑

4.1 常量引用版本 void func(const std::vector<int>& v)

void readOnly(const std::vector<int>& v) {// 可以读取但不能修改vfor (int num : v) {cout << num << " ";}// v.push_back(10); // 错误:不能修改const引用
}
  • 结合了按引用传递的高效性和按值传递的安全性
  • 明确表示函数不会修改输入数据
  • 是现代C++推荐的做法,除非确实需要修改或需要副本

4.2 移动语义(C++11及以上)

void takeOwnership(std::vector<int>&& v) {// 可以高效"窃取"v的内容std::vector<int> local = std::move(v);
}
  • 用于表示函数将取得数据的所有权
  • 避免复制,适合临时对象或明确要转移所有权的场景

5. 最佳实践建议

优先使用const引用:对于不需要修改的大型对象

void func(const std::vector<int>& v);

按值传递

  • 需要独立副本时
  • 小型或基本类型(如int、float等)
  • 明确要复制数据时

非const引用

  • 需要修改调用者的数据时
  • 明确函数会修改输入时

右值引用

  • 实现移动语义时
  • 处理临时对象或需要转移所有权时

选择哪种形式取决于函数的具体需求和对性能的考虑。

http://www.dtcms.com/a/295389.html

相关文章:

  • rust-数据结构
  • 聚观早报 | 猿编程推动中美青少年AI实践;华为Pura 80数字版售价公布;iPhone 17 Air电池曝光
  • Redis数据类型与内部编码
  • 国产数据库拐点已至:电科金仓用“融合+AI”重新定义下一代数据底座
  • rustfs/rustfs基于 Rust 的高性能分布式存储系统
  • 进程通信----匿名管道
  • 进阶向:基于Python的本地文件内容搜索工具
  • 加入淘宝联盟内容库,以便在B站等平台被推广
  • 我的新项目又来咯!
  • iOS 抓包工具有哪些?按能力划分的实用推荐与使用心得
  • 开发运维DevOps(附电子书资料)
  • 办公自动化入门:如何高效将图片整合为PDF文档
  • 7月25日 矩阵起源亮相深圳DA数智大会,解读多模态大模型驱动的数据处理新方法
  • 如何保证GPFS文件系统的强一致性
  • PDF转Markdown - Python 实现方案与代码
  • Go进阶高并发(多线程)处理教程
  • 中小企业安全落地:低成本漏洞管理与攻击防御方案
  • 新手操作steam搬砖项目,应该如何快速起步
  • 图机器学习(19)——金融数据分析
  • 深度分析Java类加载机制
  • 医疗AI轻量化部署方案的深度梳理与优化路径判研
  • k8s把某个secret挂在某命名空间下
  • MySQL深度理解-MySQL事务优化
  • 现代C++的一般编程规范
  • 【CMake】CMake 常用语法总结
  • SSP通过SDK对接流量的原理与实现
  • SSM之表现层数据封装-统一响应格式全局异常处理
  • 主要分布在背侧海马体(dHPC)CA1区域(dCA1)的位置细胞对NLP中的深层语义分析的积极影响和启示
  • 大模型处理私有数据的核心技术
  • 《R 矩阵》