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


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

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

    ReturnType DoSomething(Type parameter);
    
    • 1

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

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

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

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

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

    ReturnType Result = DoSomething(argument);
    
    • 1

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

    #include 
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    输出:

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

    分析:

    计算平方的函数位于第 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++后台高级服务器课程

  • 相关阅读:
    GIS 数据结构整理:网格索引
    【MyBatis】MyBatis基础内容介绍
    阿里云盘搜索引擎项目架构图
    JS--判断空值(null、undefined、NaN、false、空字符串等)
    ROS学习笔记03、ROS通信机制(话题通信、服务通信、参数服务器)
    【2022秋招面经】——Django
    uni-app入门:页面布局之window和tabbar
    硬件知识——内存
    Treap 原理详解和实战
    项目管理的核心:制定明确的项目进度计划
  • 原文地址:https://blog.csdn.net/qq_41317716/article/details/133692296