cleanc++05_02 - Move语义与右值引用
2021/11/21 20:40:12
本文主要是介绍cleanc++05_02 - Move语义与右值引用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Move 语义
什么是Move语义?
简单来说,就是只移动对象的数据,而不需要对原对象进行深拷贝。
Move语义的优势——Move操作符效率比拷贝操作符效率高。
使用方法:
class Clazz{ public: Clazz() noexcept; Clazz(clazz&& other) noexcept; // move 构造函数 Clazz& operator =(clazz&& other) noexcept; // move赋值运算符 }
noexcept
是C++11 为了替代 throw() 而提出的一个新的关键字,表示被修饰的函数 不允许抛出任何异常
noexcept()
括号里面可以接受一个bool值(true、false),或者一个常量表达式,并将常量表达式的结果转换为bool值。true表示函数不会抛出异常,反之则可能抛出异常。
&&
为右值引用
右值引用
什么是右值? c语言中将赋值语句的等号左右两边定义为左值和右值,C++沿用了这个说法,实际上 左值是一个在内存中占有位置的对象,其具有可访问和可识别的内存地址;而右值大多是一些临时对象或者子对象,因此不能给右值赋值。
如 int sum = 1+2;
sum就是左值,而表达式 "1+2"是一个右值,右值在使用时会占有内存,但当执行下条语句时,这块内存就会释放。
由于move语义在c++11之后的引入,通过右值引用就可以得到右值的内存位置。甚至还可以运用指针改变这块内存上的数据。
右值引用可以作为任意函数或者方法的参数,其适用的场景是move构造器和move赋值运算符。
关于move语义使用的建议:
-
大量使用Move语义会降低代码的可读性,而且编译器可能无法执行其优化策略。
-
move 或多或少是对右值引用对象的一个强制类型转换。
-
一个类需要显示定义其析构函数时,总是需要定义拷贝构造、赋值构造函数、move构造器和move赋值运算符。同样的,当这个类不需要显示定义析构函数时,也不要声明或定义拷贝构造、赋值构造函数、move构造器和move赋值运算符;用智能指针来管理资源。
这篇关于cleanc++05_02 - Move语义与右值引用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享