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.mzph.cn/news/99451.shtml

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

相关文章

基于OpenCV设计的流媒体播放器(RTSP、RTMP)

一、前言 随着互联网的普及和发展,流媒体技术已成为日常生活中不可或缺的一部分。流媒体播放器作为流媒体技术的重要组成部分,其性能和功能直接影响到用户的观影体验。本文介绍使用OpenCV和Qt设计一款流媒体播放器,专门用于播放直播视频流,例如RTSP、RTMP。该播放器只播放…

项目进展(十)-解决ADS1285在调试时出现的问题

一、解决大坑 在项目进展&#xff08;九&#xff09;-完善ADS1285代码这边博客中&#xff0c;看似解决了问题&#xff0c;可以去读数据&#xff0c;但是其实是给自己挖大坑&#xff0c;这边博客就是来填坑的。   首先呢&#xff0c;上篇博客说的是用0x12指令来读取数据&#…

Transformer模型 | Python实现TransformerCPI模型(pytorch)

文章目录 效果一览文章概述程序设计参考资料效果一览 文章概述 Python实现TransformerCPI模型(tensorflow) Dependencies: python 3.6 pytorch >= 1.2.0 numpy RDkit = 2019.03.3.0 pandas Gensim >=3.4.0 程序设计 import torch import numpy as np import random …

Qt QList类和QLinkedList类 详解

一、QList 类 对于不同的数据类型&#xff0c;QList<T>采取不同的存储策略&#xff0c;存储策略如下&#xff1a; 如果T 是一个指针类型或指针大小的基本类型(该基本类型占有的字节数和指针类型占有的字节数相同)&#xff0c;QList<T>将数值直接存储在它的数组当…

WPF中, 如何将控件的触发事件绑定到ViewModel

在DataGrid 等控件中, 有很多这种带闪电符号的触发事件. 如果用传统的事件驱动, 则直接在后台中建立 一个private PropertyChanged(Sender s, EventAgars Args) 即可. 但是如果需要绑定到ViewModel的话? 应该怎么做? 带闪电符号的触发事件 实现viewModel绑定前端触发事件的…

day58:ARMday5,GPIO流水灯实验

汇编指令&#xff1a; .text .global _start _start: 1.设置GPIOE GPIOF寄存器的时钟使能 RCC_MP_AHB4ENSETR[5:4]->1 0x50000a28 LDR R0,0x50000a28 LDR R1,[R0] ORR R1,R1,#(0x3<<4) STR R1,[R0]2.设置PE10、PF10、PE8管脚为输出模式&#xff0c;GPIOE_MODER[21…

常见SQL错误用法案例和总结

1. LIMIT 语句 分页查询是最常用的场景之一&#xff0c;但也通常也是最容易出问题的地方。比如对于下面简单的语句&#xff0c;一般DBA想到的办法是在type, name, create_time字段上加组合索引。这样条件排序都能有效的利用到索引&#xff0c;性能迅速提升。 SELECT * FROM …

Jenkins+Allure+Pytest的持续集成

一、配置 allure 环境变量 1、下载 allure是一个命令行工具&#xff0c;可以去 github 下载最新版&#xff1a;https://github.com/allure-framework/allure2/releases 2、解压到本地 3、配置环境变量 复制路径如&#xff1a;F:\allure-2.13.7\bin 环境变量、Path、添加 F:\a…

华为C语言编程规范(2W字总结)

1、代码总体原则 1、清晰第一 清晰性是易于维护、易于重构的程序必需具备的特征。代码首先是给人读的&#xff0c;好的代码应当可以像文章一样发声朗诵出来。 目前软件维护期成本占整个生命周期成本的40%~90%。根据业界经验&#xff0c;维护期变更代码的成本&#xff0c;小型…

全栈开发笔记1:首个项目的收获

本文为编程导航实战项目学习笔记。 文章目录 7.跨域问题解决 2023.10.26.项目部署 2023.10.15.统一处理返回值 2023.10.14.开发注册和用户管理 2023.09303.开发登陆注册接口 2023.09.172.数据库设计1.前后端初始化 2023.9.16 7.跨域问题解决 2023.10.2 三种方式&#xff1a; …

用c语言实现静态通讯录

思路&#xff1a; 将代码分成三个模块&#xff0c;头文件contact.h&#xff1a;声明函数&#xff0c;定义结构体 test.c测试类&#xff0c;contact.c用来实现通讯录中的函数功能 1.打印菜单&#xff0c;让用户进行选择 2.定义一个结构体PeoInfo&#xff0c;其中包含联系人的…

OCR让点读笔如虎添翼

点读笔是一种智能学习工具&#xff0c;它可以通过识别文字来提供相应的语音或图像反馈。在实现文字识别功能时&#xff0c;点读笔通常会借助OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术。下面将详细介绍点读笔如何利用OCR技术实现文…

【Spring Cloud系统】- Zookeer特性与使用场景

【Spring Cloud系统】- Zookeer特性与使用场景 一、概述 Zookeeper是一个分布式服务框架&#xff0c;是Apache Hadoop的一个子项目&#xff0c;它主要是用来解决分布式应用中经常遇到的一些数据管理问题。如&#xff1a;统一命名服务、状态同步服务、集群管理、分布式应用配置…

Python的logging模块Demo

Tip&#xff1a;默认情况下&#xff0c;logging模块不会自动地将日志存储到某个特定路径&#xff0c;除非你指定了该路径。你需要创建一个FileHandler&#xff0c;然后为其设置一个文件路径&#xff0c;这样日志就会被写入到该文件中。 以下是一个简单的例子&#xff0c;展示如…

Android开发入门技能(Java)

Android开发入门技能 一些流行的框架和库 安卓开发中有许多主流框架和库&#xff0c;它们可以帮助开发者更轻松地构建功能强大、高效和可维护的应用程序。以下是一些主要的安卓开发框架和库&#xff1a; Android Jetpack&#xff1a;Android Jetpack是官方提供的一套库和工具…

基于AlexNet深度学习网络的智能垃圾分类系统matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、基于AlexNet深度学习网络的智能垃圾分类系统概述 4.2、基于AlexNet深度学习网络的智能垃圾分类系统主要原理 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab20…

【CSS】Tailwind CSS

直接参考 Tailwind CSS 安装提供了四种方式。因为我常用构建工具搭建项目&#xff0c;所以选择 Using PostCSS 。 其中 tailwind.config.js 的配置可以改为&#xff1a; module.exports {content: [./index.html, ./src/**/*.{vue,js,ts,jsx,tsx}],theme: {extend: {},},pl…

在宝塔面板环境下安装nps服务端

在宝塔面板环境下安装nps服务端 一、所需环境二、开始安装三、打开nps控制台四、更改默认账号密码和连接秘钥五、反向代理挂载SSL证书 一、所需环境 阿里云轻应用服务器&#xff08;选择宝塔应用镜像&#xff09;域名&#xff08;最好也是阿里注册的域名&#xff09;对应的ssl…

echarts的bug,在series里写tooltip,不起作用,要在全局先写tooltip:{}才起作用,如果在series里写的不起作用就写到全局里

echarts的bug&#xff0c;在series里写tooltip&#xff0c;不起作用&#xff0c;要在全局先写tooltip&#xff1a;{show:true}才起作用&#xff0c;如果在series里写的不起作用就写到全局里 series里写tooltip不起作用&#xff0c;鼠标悬浮在echarts图表上时不显示提示 你需要…

聊聊分布式架构01——http通信基础

目录 web通信的简单结构 网络通信基础TCP/IP TCP/IP 通信传输流 HTTP中的三剑客 负责传输的IP协议 确保可靠性的TCP协议 SYN攻击&#xff08;SYN Flood Attack&#xff09; 四次挥手 负责域名解析的DNS服务 基于 TCP 协议实现通信 TCP 协议的通信过程 Web通信的简单…