找回密码
 立即注册

QQ登录

只需一步,快速开始

工控课堂 首页 工控文库 上位机编程 查看内容

C++性能优化利器:std::move()

2022-4-17 18:04| 发布者: 198366809| 查看: 943| 评论: 0

摘要: C++11的标准库 utility 提供了一个非常有用的函数 std::move(),std::move() 函数将一个左值强制转化为右值引用,以用于移动语义。关于左值和右值的理解可以参考:C++中左值和右值的理解移动语义,允许直接转移对象 ...
C++性能优化利器:std::move()

C++11的标准库 <utility> 提供了一个非常有用的函数 std::move(),std::move() 函数将一个左值强制转化为右值引用,以用于移动语义。

关于左值和右值的理解可以参考:C++中左值和右值的理解

移动语义,允许直接转移对象的资产和属性的所有权,而在参数为右值时无需复制它们。

换一种说法就是,std::move() 将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝。

因此,通过std::move(),可以避免不必要的拷贝操作。

应用举例

比如创建一个临时对象,传递给某个函数,这中间是有一次拷贝的。临时对象拷贝到函数里的对象后,临时对象就销毁了。如果临时对象里有一些动态资源,也必须要拷贝一份。

但这是毫无意义的,因为临时对象拷完就不用了,不如直接把临时对象的资源掏出来直接使用。

这就需要区分临时对象是否可以这样使用,因为有些对象在其他地方也会被使用,不能随意更改。右值引用就是让函数知道是不是临时对象的标记,这就是std::move()的作用。

比如下面这个例子,原str(lvalue值)被moved from之后值被转移,所以变为空字符串。

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main()
{
    string str = "hello";
    cout << "before str: " << str << endl;
  
    vector<string> vstr;
    vstr.emplace_back(std::move(str));
    cout << "after  str: " << str << endl;
  
    return 0;
}

运行结果为:

C++性能优化利器:std::move()

若去掉std::move(),运行结果为:

C++性能优化利器:std::move()

std::move是为性能而生。std::move() 将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝,所以可以提高效率,改善性能。

C++性能优化利器:std::move()
关注公众号,加入500人微信群,下载100G免费资料!

最新评论

热门文章
关闭

站长推荐上一条 /1 下一条

QQ|手机版|免责声明|本站介绍|工控课堂 ( 沪ICP备20008691号-1 )

GMT+8, 2025-12-23 04:29 , Processed in 0.055291 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

返回顶部