std:move基本用法
std::move函数可以以非常简单的方式将左值引用转换为右值引用。(左值、左值引用、右值、右值引用 参见:
通过std::move,可以避免不必要的拷贝操作。
std::move是为性能而生。
std::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝。
说明:
- std::move(t) 用来表明对象t 是可以moved from的,它允许高效的从t资源转换到lvalue上.
- 注意,标准库对象支持moved from的左值在moved 之后它的对象原值是有效的(可以正常析构),但是是unspecified的,可以理解为空数据,但是这个对象的其他方法返回值不一定是0,比如size().所以,moved from 之后的对象最好还是不要使用吧?(如有不正确理解,请告知)
- 对本身进行move,并赋值给本身是undefined的行为.
如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,掏空后,最好不要使用strv.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"
更详细请看
https://blog.csdn.net/swartz_lubel/article/details/59620868
std:move基本用法相关推荐
- std:move基本用法和理解
场景: C++ 标准库使用比如vector::push_back 等这类函数时,会对参数的对象进行复制,连数据也会复制.这就会造成对象内存的额外创建, 本来原意是想把参数push_back进去就行了. ...
- std::move原理实现与用法总结
文章目录 一.左值与右值 二.左值引用和右值引用 1.std::move简介 2.std::move详解 3.std::move的优点 右值引用(及其支持的Move语意和完美转发)是C++0x加入 ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)std::move
1. 标准库定义 / / 在返回类型和类型转换中也要用到 typename, 参见 16.1.3 节( 第 593 页 ) reference 是在 16.2.3 节( 第 605 页 ) 中介绍的 ...
- [C/C++]关于C++11中的std::move和std::forward
http://blog.sina.com.cn/s/blog_53b7ddf00101p5t0.html std::move是一个用于提示优化的函数,过去的c++98中,由于无法将作为右值的临时变量从 ...
- 什么是std :: move(),什么时候应该使用?
它是什么? 它有什么作用? 什么时候应该使用? 赞赏良好的链接. #1楼 当您需要在其他地方"传输"对象的内容时,可以使用move,而无需复制(即内容不重复,这就是为什么它可以用于 ...
- C/C++编程:std::move(将左值强制转换为右值)
正文 C++11标准中借助右值引用可以为指定类添加移动构造函数,这样当使用给类的右值对象(可以理解为临时对象)初始化同类对象时,编译器会优先选择移动构造函数 注意,移动构造函数的调用时机是:用同类的右 ...
- 【c++】std::move 所有权转移的使用
1. std::move用法详细梳理 ref_frames_ = std::move(ref_frames);cur_frames_ = cur_frames; 使用std::move函数的好处是可以 ...
- 左值/右值/左值引用/右值引用/move的用法介绍
目录 问题 左值和右值 概念总结: 需要用到左值的运算符: 引用分类 左值引用 右值引用 右值引用到底什么用? std::move()函数介绍 问题 什么是左值和右值? 什么是左/右值引用? 左/右值 ...
- C++右值引用 和 std::move()
void debug(int&& a){return a; } std::move(a) 可以将左值变为右值 int c = 0x100; // c 可以被取地址,c 为左值,c++ ...
最新文章
- 2017年10月08日普及组 蜡烛
- Apache Ranger插件的美丽简洁
- STM32H743+CubeMX-两路FDCAN同时工作的终极方案(RTX5)
- Tomcat 5 5-Manager App HOW-TO 翻译了部份 努力中
- JQuery Dialog(JS模态窗口,可拖拽的DIV)
- linux 常用指令汇总
- c语言正则表达式库,c语言正则表达式库--PCRE
- explain分析sql效果
- 13个坏习惯让IT工作者中过劳(转)
- table或者列表中超出的字用省略号代替的方法(支持IE6)
- CF984C Finite or not?
- 【Unity3d】脚本的生命周期及其相关函数
- leetcode547 朋友圈
- 万物皆可秒——淘宝秒杀Python脚本,扫货618,备战双11!
- GTX1060 Windows10 旧版显卡驱动下载链接
- 玩转EXCEL系列-选择性粘贴几个实用技巧
- 软件工程个人项目— 数独
- 社交网络关系 mysql架构_社交网络海量用户关系(关系链)设计思考
- Django 博客开发教程 8 - 博客文章详情页
- 3D打印技术新进展,正带来哪些产业新机会?