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

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

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

cpp 复制代码
ReturnType DoSomething(Type parameter);

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

cpp 复制代码
ReturnType Result = DoSomething(argument); // function call

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

可避免复制步骤的函数版本类似于下面这样:

cpp 复制代码
ReturnType DoSomething(Type& parameter); // note the reference&

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

cpp 复制代码
ReturnType Result = DoSomething(argument);

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

cpp 复制代码
#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++后台高级服务器课程

相关推荐
程序员老舅31 分钟前
C++参数传递:值、指针与引用的原理与实战
c++·c/c++·值传递·引用传递·指针传递·参数传递机制
liu****1 小时前
8.list的使用
数据结构·c++·算法·list
立志成为大牛的小牛1 小时前
数据结构——二十六、邻接表(王道408)
开发语言·数据结构·c++·学习·程序人生
草莓熊Lotso2 小时前
C++ 方向 Web 自动化测试入门指南:从概念到 Selenium 实战
前端·c++·python·selenium
CoderCodingNo3 小时前
【GESP】C++五级考试大纲知识点梳理, (5) 算法复杂度估算(多项式、对数)
开发语言·c++·算法
星河队长3 小时前
VS创建C++动态库和C#访问过程
java·c++·c#
沐怡旸4 小时前
【穿越Effective C++】条款02:尽量以const, enum, inline替换#define
c++·面试
给大佬递杯卡布奇诺5 小时前
FFmpeg 基本API avcodec_alloc_context3函数内部调用流程分析
c++·ffmpeg·音视频
QT 小鲜肉5 小时前
【个人成长笔记】Qt 中 SkipEmptyParts 编译错误解决方案及版本兼容性指南
数据库·c++·笔记·qt·学习·学习方法
看到我,请让我去学习5 小时前
Qt 控件 QSS 样式大全(通用属性篇)
开发语言·c++·qt