前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++11 改成程序性能的方法---std::move

C++11 改成程序性能的方法---std::move

作者头像
CPP开发前沿
发布2021-11-16 13:47:02
1.1K0
发布2021-11-16 13:47:02
举报
文章被收录于专栏:CPP开发前沿CPP开发前沿

在C++11中提供了std::move方法,该方法为使用移动语义提供了方便,在使用该方法的过程中,它并没有拷贝任何对象,只是将对象的状态或者所有权从一个对象转移到了另外一个对象,因此,在实际的使用过程中,减少了对象的多次拷贝,从而提升了程序的性能。

1 拷贝和move区别

为了方便理解拷贝和move的区别,请看下图:

图1 拷贝和移动

在图1中,如果将SourceObject对象拷贝到DestObject的过程中,如果使用拷贝,则需要将Source对象也进行拷贝,但如果使用move方法,则只是将SourceObject移动到DestObject对象中,仅仅是对象所有权和状态的改变,并没有发生任何拷贝。在这一过程中,move唯一的功能是将一个左值引用转换为一个右值引用,使我们通过右值引用使用这个对象,从而实现移动构造。

2 拷贝和move实例

在实际编码过程中,C++11提供的move方法会将拷贝的代价降低到最小,例如在vector中插入元素时,就可以使用move语义,减少对像的拷贝:

代码语言:javascript
复制
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 << '\n';
  return 0;
 }

程序运行结果如下:

代码语言:javascript
复制
myvector contains: foo-string bar-string

在上面的代码中vector插入了两个对象,第一个对象使用了拷贝,在插入容器后,依旧可以使用foo对象;第二个对象使用move,在插入容器后,就不在拥有对象,所以如果在上面的代码中,加一行如下输出,实际上是bar是打印不出任何内容的,如下:

代码语言:javascript
复制
std::cout<<"foo="<<foo<<" ,bar="<<bar<<std::endl;

运行后的结果如下:

代码语言:javascript
复制
foo=foo-string ,bar=

3 move原型

move方法的原型如下:

代码语言:javascript
复制
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()可以应用于左值,但是用后就表示当前的值不再需要了,如果后续使用了该值,则会产生意想不到的结果。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CPP开发前沿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档