C++ move()函数 C++ move()函数案例详解

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

C++ move()函数 C++ move()函数案例详解

chengjian168   2021-09-02 我要评论
想了解C++ move()函数案例详解的相关内容吗,chengjian168在本文为您仔细讲解C++ move()函数的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:C++,move(),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"

猜您喜欢

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们