C++11教程
+ -

C++11 std::move操作

2023-06-06 18 0

C++11中,标准的库<utility>中提供了一个提供了一个有用的函数std::move,它的功能是将左值强制转化为右值的引用。
那它有什么作用了?

  • 通过std::move,可以避免不必要的拷贝操作。
  • std::move是为性能而生。
  • std::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝。

如string类在赋值或者拷贝构造函数中会声明char数组来存放数据,然后把原string中的 char 数组被析构函数释放,如果a是一个临时变量,则上面的拷贝,析构就是多余的,完全可以把临时变量a中的数据直接 “转移” 到新的变量下面即可。

#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"

声名std::string时,其类成员中有一个变量指针,指向常量内存空间,其内容为“Hello”,而当执行std::move(str)时,会将str中的指针清空,同时会左值的string变量中指针指向原“Hello”.

 v.push_back(std::move(str));
 v.push_back(str);

有什么不同呢?其实就是 v.push_back(str)会深构造,重新进行内存分配,而 v.push_back(std::move(str))只是简单地进行了指针修改,提高了效率。

0 篇笔记 写笔记

memcpy,memmove重叠拷贝
内存的复制一般使用memmove和memcopy这两种函数,当内存不重叠时,这两个函数可以说是没有区别的。但当出现内存重叠时,就会出现不同的结果。内存的复制函数一般定义如下:void *fun(void *dest, const void *src, size_t count)函数将从原一地址复......
WDDM 停止、复位、移除设备及驱动卸载
说完了驱动的创建与启动,这里顺使说一下设备的停止、复位、卸载设备设备的停止/BddDdiStopDevice设备停止的回调函数为BddDdiStopDevice InitialData.DxgkDdiStopDevice = BddDdiStopDevi......
devcon update/remove命令(更新/安装/卸载驱动)
这里的inf文件为:pnpon.inf硬件ID为:*PNPONVDualA可根据需要自行修改CD /d %~dp0devcon.exe update pnpon.inf "*PNPONVDualA"echo %errorlevel% if %errorlevel% ......
PDO设备的动态创建与卸载IRP_MN_SURPRISE_REMOVAL和IRP_MN_REMOVE_DEVICE
总线驱动创建的PDO在卸载时,因卸载方式不同而不同如果是直接卸载总线,会只调用IRP_MN_REMOVE_DEVICE而如果是动态创建与卸载,在卸载的时候调用IoInvalidateDeviceRelations会导致IRP_MN_SURPRISE_REMOVAL的调用,然后调用IRP_MN_R......
IRP_MN_REMOVE_DEVICE和IRP_MN_SURPRISE_REMOVAL
一个PnP设备被删除时有两个事件会发生,一个是IRP_MN_SURPRISE_REMOVAL,另一个是IRP_MN_REMOVE_DEVICE。看名字就知道这两个事件都是告诉程序员设备已经不在了让他赶紧做点善后工作。我知道你的第一反应时什么:为什么要有两个事件呢,清理资源难道不是清理一次就够了吗?这......
删除锁IO_REMOVE_LOCK与STATUS_DELETE_PENDING
删除锁IO_REMOVE_LOCK很少见,但很重要。其结构体定义为:typedef struct _IO_REMOVE_LOCK { IO_REMOVE_LOCK_COMMON_BLOCK Common;#if DBG IO_REMOVE_LOCK_DBG_BLOCK Dbg;......
IO_REMOVE_LOCK使用方法小结
IO_REMOVE_LOCK(删除锁)的具体结构没有公开,WDK的文档中中查不到IO_REMOVE_LOCK。最开始看到IO_REMOVE_LOCK是在WDK的例子event中。下面是参考网上的一些资料之后的一点总结,错误的地方请指正。新增内容:WDK8.1 中是可以看到这个结构的,在wdm.h中。......
C++11 std::move操作
C++11中,标准的库中提供了一个提供了一个有用的函数std::move,它的功能是将左值强制转化为右值的引用。那它有什么作用了?通过std::move,可以避免不必要的拷贝操作。std::move是为性能而生。std::move是将对象的状态或者所有权从一个对象转......
驱动的卸载流程IRP_MN_REMOVE_DEVICE与其余IRP竞争
USB通用总线驱动程序源代码USBC_Dispatch函数中有这一段代码: if (!((majorFunction == IRP_MJ_PNP) && (minorFunction == IRP_MN_REMOVE_DEVICE))) { Incre......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!