0
点赞
收藏
分享

微信扫一扫

C++ move()函数

天涯学馆 2022-01-08 阅读 85

目录

1. 左值和右值的概念

2. 引用

3. 左值引用和右值引用

    3.1 左值引用

    3.2 右值引用


1. 左值和右值的概念

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

         左值是可以放在赋值号左边可以被赋值的值;左值必须要在内存中有实体;
         右值当在赋值号右边取出值赋给其他变量的值;右值可以在内存也可以在CPU寄存器。
         一个对象被用作右值时,使用的是它的内容(值),被当作左值时,使用的是它的地址。

2. 引用

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

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

        引用的基本规则:

声明引用的时候必须初始化,且一旦绑定,不可把引用绑定到其他对象;即引用必须初始化,不能对引用重定义;
对引用的一切操作,就相当于对原对象的操作。


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"


 
————————————————
版权声明:本文为CSDN博主「chengjian168」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chengjian168/article/details/107809308

举报

相关推荐

C++之move函数的使用

C++(11):std::move

c++ 函数

c++函数

C++函数

0 条评论