C++11 改成程序性能的方法---std::move
在C++11中提供了std::move方法,该方法为使用移动语义提供了方便,在使用该方法的过程中,它并没有拷贝任何对象,只是将对象的状态或者所有权从一个对象转移到了另外一个对象,因此,在实际的使用过程中,减少了对象的多次拷贝,从而提升了程序的性能。
1 拷贝和move区别
为了方便理解拷贝和move的区别,请看下图:
图1 拷贝和移动
在图1中,如果将SourceObject对象拷贝到DestObject的过程中,如果使用拷贝,则需要将Source对象也进行拷贝,但如果使用move方法,则只是将SourceObject移动到DestObject对象中,仅仅是对象所有权和状态的改变,并没有发生任何拷贝。在这一过程中,move唯一的功能是将一个左值引用转换为一个右值引用,使我们通过右值引用使用这个对象,从而实现移动构造。
2 拷贝和move实例
在实际编码过程中,C++11提供的move方法会将拷贝的代价降低到最小,例如在vector中插入元素时,就可以使用move语义,减少对像的拷贝:
int main ()
{
std::string foo = "foo-string";
std::string bar = "bar-string";
std::vector<std::string> myvector;
myvector.push_back (foo); // copies
myvector.push_back (std::move(bar)); // moves
std::cout << "myvector contains:";
for (std::string& x:myvector)
std::cout << ' ' << x; std::cout << '
';
return 0;
}
程序运行结果如下:
myvector contains: foo-string bar-string
在上面的代码中vector插入了两个对象,第一个对象使用了拷贝,在插入容器后,依旧可以使用foo对象;第二个对象使用move,在插入容器后,就不在拥有对象,所以如果在上面的代码中,加一行如下输出,实际上是bar是打印不出任何内容的,如下:
std::cout<<"foo="<<foo<<" ,bar="<<bar<<std::endl;
运行后的结果如下:
foo=foo-string ,bar=
3 move原型
move方法的原型如下:
template <typename T>
typename remove_reference<T>::type&& move(T&& t)
{
return static_cast<typename remove_reference<T>::type&&>(t);
}
从move方法的定义来看,move实际上并没有做任何事情,只是做了类型强制转换,当传入的参数为右值时,move实际上没有做任何事情,但是为了支持左值传参,让T&&满足万能传参,还是使用了引用折叠的方法,具体如下:
如果是X& &、X& && 和 X&& & 折叠后转换成为:X&; 如果是X&& && 折叠后转换成为:X&&。
所以,当t
为左值或者左值引用时,进过引用折叠,得到的类型是T&
。最后就是将左值转换为右值并返回了。
使用move传递左值时,还需要注意一点就是:td::move()
可以应用于左值,但是用后就表示当前的值不再需要了,如果后续使用了该值,则会产生意想不到的结果。
相关文章
- 通过Lambda实现URL文件直接上传到S3
- 使用混合云HPC场景加快计算机辅助工程工作负载运行速度
- 亚马逊云科技和恩智浦半导体公司NXP 助力打造软件定义汽车
- 借助Serverless服务实现EMR Instance Fleets集群自定义弹性伸缩
- IAM 托管策略维护经验分享
- Python: python的简单表达式计算器
- Amazon SageMaker Endpoint for built-in TFS模型推理优化
- 使用 Amazon Selling Partner API Guard 来进行安全审计使你的 SP-API 应用更合规
- 宣布推出统一软件开发服务 Amazon CodeCatalyst(预览版)
- 新功能 — 使用 Amazon EventBridge Pipes 在事件产生器和事件使用器之间创建点对点集成
- 新功能 – 使用适用于 IDP 的 Amazon Comprehend 处理 PDF、Word 文档和图像
- 推出 Amazon GameLift Anywhere – 在您自己的基础设施上运行游戏服务器
- 新增功能 – Amazon EC2 Hpc6id 实例针对高性能计算进行了优化
- 全新 AWS SimSpace Weaver – 在云端运行大规模空间模拟
- VPC Lattice 简介 — 简化服务到服务通信的联网(预览版)
- AWS Marketplace 供应商详情 – 简化第三方软件风险评估
- python super()
- 新功能:Amazon CloudWatch 跨账户可观察性
- AWS Application Migration Service 的主要更新:新的迁移服务器分组、更新的启动和启动后模板
- 全新 —— 正式推出 Amazon EFS Elastic Throughput