开发者

C++中move的使用及说明

目录
  • C++ move使用
    • 作为可以归纳为以下几点
  • C++move函数详解
    • 为什么参数已经是右值引用了?
    • remove_reference的作用是什么?
    • remove_reference是怎么实现的?
  • 总结

    C++ move使用

    move作用主要可以将一个左值转换成右值引用,从而可以调用C++11右值引用的拷贝构造函数,在对象拷贝的时候,在运行时,它们不会产生一行代码原先的对象也会清空, 可以减少资源创建和释放。

    作为可以归纳为以下几点

    1、std::move函数可以以非常简单的方式将左值引用转换为右值引用。

    2、通过std::move,可以避免不必要的拷贝操作。

    3、std::move是为性能而生。

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

    两个地址是独立的,move操作实际上是系统将这一块地址属于哪一个地址的登记改一下,实际上这一块内存根本没有发生任何变化。

    打个比方,就好比说一个房产,原来登记在张三名下,“张三”就是地址。张三也有管理权。move就相当于过户。过户给李四后,“李四”就是这个房子的“地址”,管理权自然也交接给了李四。

    C++中move的使用及说明

    C++move函数详解

    C++11的一个最重要特性就是支持移动语义,其中一个比较关键的函数就是 std::move 那这个函数的作用是什么?

    首先打开库文件 找到move的定义:

    C++中move的使用及说明

    注意:不要把&&理解成引用的引用,这就是一个关键字

    大概函数如下:

    template<class T>
    remove_reference_t<T>&& move(T && a) noexcept
    {
    	return static_cast<remove_reference_t<T>&&>(arg);
    }

    说白了这个函数的作用就是把传进来的参数强制转换成右值引python用

    可能有些人会有疑问,

    编程客栈

    为什么参数已经是右值引用了?

    这就要说到参数推导了比如以下例子:

    template<typename T>
    void foo(T&& params);

    如果传进来的是一个左值

    int a = 10;
    foo(a);

    此时params被推导为int& 如果传进来的是一个右值

    foo(20);

    此时paramas被推导为int&&

    remove_reference的作用是什么?

    就是去掉引用,比如int& 变成int int&&变成 int

    也就是说std::move把你传进来的参数所有的引用都去掉,然后在加上&&,也就是变成右值引用

    remove_reference是怎么实现的?

    非常简单,首先看看定义:

    C++中move的使用及说明

    可以看到有了三个模板匹配,不管你传的是什么,我都能去掉你的引用,通过::type得到你原始的类型

    C++中move的使用及说明

    其中remove_referenct_t 无非是一个方便的写法 typename是为了说明www.devze.com remove_reference是一个class

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。python

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜