C++11中的右值引用、移动语句和完美转换
C++11引入右值引用和移动语句,可以避免无谓的复制,提高程序的性能,右值引用记为T&&。
辨别左右值的便捷方法:看能不能对表达式取地址,若果能,则为左值,否则为右值。
左值引用, 使用 T&, 只能绑定左值;
右值引用, 使用 T&&, 只能绑定右值
常量左值, 使用 const T&, 既可以绑定左值又可以绑定右值;
已命名的右值引用,编译器会认为是个左值;
编译器有返回值优化,但不要过于依赖
要实现移动语义就必须增加两个函数:移动构造函数和移动赋值构造函数。
将左值转化为右值,使用T std::move(T)。就是将原来的T类型有变量名的数据转化为没有变量名的数据,而原来的变量值变成空值。
通过std::is_same即可判断两个类型是否一样,特别在模板里面,在不清楚模板的参数时,此功能可以对一些特定的参数类型进行特殊的处理,在模板里是利器!
在C++11中,拷贝构造/赋值和移动构造/赋值函数必须同时提供或同时不提供,程序员才能保证类同时具有拷贝和移动语义。只声明其中一种的话,类都仅能实现一种语义。其实,只实现一种语义,在类的编写中也是非常常见的。
只有移动语义的类型非常有趣,因为只有移动语义表示该类型的变量所拥有的资源只能被移动,而不能被拷贝。那么这样的自由必须是唯一的。因此,只有移动语义构造的类型往往都是“资源型”的类型。比如说智能指针,文件流,都可以视为“资源型”的类型。
在标准库中仅可移动的模板类:unique_ptr。vs2011,把ifstream这样的类型实现为仅可移动的。
在<type_traits>里,可通过一些辅助模板类来判断一个类型是否可以移动的,比如:
is_move_constructible, is_trivially_move_constructible, is_nothrow_move_constructible,使用方法仍然是使用其成员value。比如:
cout << is_move_constructible<UnknownType>::value;
就可打印出Unknown是否可以移动,这在一些情况下还是非常有用的。
有了移动语义,可以实现高性能的置换(swap)函数。只是置换指针,没有资源的释放与申请。
参考:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?