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

C++中使用引用避免内存复制

C++中使用引用避免内存复制

引用让您能够访问相应变量所在的内存单元,这使得编写函数时引用很有用。典型的函数声明类似于下面这样:

ReturnType DoSomething(Type parameter);

调用函数 DoSomething() 的代码类似于下面这样:

ReturnType Result = DoSomething(argument); // function call

上述代码导致将 argument 的值复制给 Parameter,再被函数 DoSomething() 使用。如果 argument 占用了大量内存,这个复制步骤的开销将很大。同样,当 DoSomething() 返回值时,这个值被复制给 Result。如果能避免这些复制步骤,让函数直接使用调用者栈中的数据就太好了。为此,可使用引用。
可避免复制步骤的函数版本类似于下面这样:

ReturnType DoSomething(Type& parameter); // note the reference&

调用该函数的代码类似于下面这样:

ReturnType Result = DoSomething(argument);

由于 argument 是按引用传递的, Parameter 不再是 argument 的拷贝,而是它的别名。另外,接受引用参数的函数可使用这些参数返回值,如下面示例程序所示:

#include <iostream>
using namespace std;void GetSquare(int& number)
{number *= number;
}int main()
{cout << "Enter a number you wish to square: ";int number = 0;cin >> number;GetSquare(number);cout << "Square is: " << number << endl;return 0;
}

输出:

Enter a number you wish to square: 5
Square is: 25

分析:

计算平方的函数位于第 3~6 行。它通过引用参数接受一个要计算其平方的数字,并通过该参数返回结果。如果忘记将参数 number 声明为引用( &), 结果将无法返回到调用函数 main(), 因为 GetSquare() 将使用 number 的本地拷贝执行运算, 而函数结束时该拷贝将被销毁。通过使用引用, 可确保 GetSquare()main() 中定义的 number 所在的内存单元进行操作。这样,函数 GetSquare() 执行完毕后,也可以在 main() 中使用运算结果。
在这个示例中,修改了输入参数。如果要保留这两个值—传入的数字及其平方,可让函数接受两个参数:一个包含输入;另一个提供平方值。

该文章会更新,欢迎大家批评指正。

推荐一个零声学院的C++服务器开发课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容
点击立即学习:C/C++后台高级服务器课程

http://www.lryc.cn/news/187215.html

相关文章:

  • 计算机网络(第8版)-第4章 网络层
  • chromadb 0.4.0 后的改动
  • Windows环境下下载安装Elasticsearch和Kibana
  • 机器学习:随机森林
  • ctfshow-web11(session绕过)
  • 状态模式:对象状态的变化
  • 解耦常用方法
  • 根据二叉树创建字符串--力扣
  • 代码事件派发机制(观察者模式)
  • 微服务技术栈-Nacos配置管理和Feign远程调用
  • 操作系统 OS
  • 基于ffmpeg给视频添加时间字幕
  • 爬虫基础知识点快速入门
  • 解释器模式 行为型模式之五
  • 2023年中国汽车座舱行业发展现状及趋势分析:高级人机交互(HMI)系统将逐步提升[图]
  • 常见的通用型项目管理软件推荐
  • 手机总是提醒系统更新,到底要不要更新呢?
  • 什么是API
  • RedissonClient 分布式锁 处理并发访问共享资源
  • Hadoop-2.5.2平台环境搭建遇到的问题
  • 基于WTMM算法的图像多重分形谱计算matlab仿真
  • VR全景展示带来旅游新体验,助力旅游业发展!
  • Xcode 15 编译出错问题解决
  • 基于指数趋近律的机器人滑模轨迹跟踪控制算法及MATLAB仿真
  • 华为云API自然语言处理的魅力—AI情感分析、文本分析
  • 微擎小程序获取不到头像和昵称解决方案
  • Qt 对界面类重命名的步骤
  • 使用docker搭建nacos单机、集群 + mysql
  • FreeRTOS自我救赎2之基本工程建立
  • 【C++设计模式之解释器模式:行为型】分析及示例