网站/小程序/APP个性化定制开发,二开,改版等服务,加扣:8582-36016

    这篇文章主要介绍了C++ move()函数案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

    要了解move函数首先弄清左值引用和右值引用。

    左值、左值引用、右值、右值引用

    1、左值和右值的概念

            左值是可以放在赋值号左边可以被赋值的值;左值必须要在内存中有实体;

            右值当在赋值号右边取出值赋给其他变量的值;右值可以在内存也可以在CPU寄存器。

            一个对象被用作右值时,使用的是它的内容(值),被当作左值时,使用的是它的地址

    2、引用

            引用是C++语法做的优化,引用的本质还是靠指针来实现的。引用相当于变量的别名。

            引用可以改变指针的指向,还可以改变指针所指向的值。

            引用的基本规则:

    1. 声明引用的时候必须初始化,且一旦绑定,不可把引用绑定到其他对象;即引用必须初始化,不能对引用重定义

    2. 对引用的一切操作,就相当于对原对象的操作。

    3、左值引用和右值引用

        3.1 左值引用

             左值引用的基本语法:type &引用名 = 左值表达式;

        3.2 右值引用

            右值引用的基本语法type &&引用名 = 右值表达式;

            右值引用在企业开发人员在代码优化方面会经常用到。

            右值引用的“&&”中间不可以有空格。

    • std::move并不能移动任何东西,它唯一的功能是将一个左值强制转化为右值引用,继而可以通过右值引用使用该值,以用于移动语义。从实现上讲,std::move基本等同于一个类型转换:static_cast<T&&>(lvalue);

    • C++ 标准库使用比如vector::push_back 等这类函数时,会对参数的对象进行复制,连数据也会复制.这就会造成对象内存的额外创建, 本来原意是想把参数push_back进去就行了,通过std::move,可以避免不必要的拷贝操作。

    • std::move是为性能而生。

    • std::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝。

    用法:

    原lvalue值被moved from之后值被转移,所以为空字符串. 

    #include <iostream>
    #include <utility>
    #include <vector>
    #include <string>
    int main()
    {
        std::string str = "Hello";
        std::vector<std::string> v;
        //调用常规的拷贝构造函数,新建字符数组,拷贝数据
        v.push_back(str);
        std::cout << "After copy, str is \"" << str << "\"\n";
        //调用移动构造函数,掏空str,掏空后,最好不要使用str
        v.push_back(std::move(str));
        std::cout << "After move, str is \"" << str << "\"\n";
        std::cout << "The contents of the vector are \"" << v[0]
                                             << "\", \"" << v[1] << "\"\n";
    }

     

    输出:


    After copy, str is "Hello"

    After move, str is ""

    The contents of the vector are "Hello", "Hello"


    评论 0

    暂无评论
    0
    0
    0
    立即
    投稿
    发表
    评论
    返回
    顶部