c++数据结构之c++11(二)

一.再探左右值引用

1.左右值引用的优势(面试题!!!!!!!!)

①.减少拷贝,提升效率。

②.左值引用可以对参数或者返回值进行修改。

2.左值引用的缺憾以及解决方案

①.缺憾

②.解决方案

Ⅰ.用输出型参数,即把返回值放到参数列表里。

劣势在于可读性差。

Ⅱ.编译器优化传值返回(c++11出现前的优化)

一代优化:

把拷贝两步并作一步,省去临时对象,调函数,用str给ret拷贝构造,一次到位。

二代优化:

很激进,直接省去了拷贝构造,让函数返回值变成ret的别名,相当于直接用函数构造ret

但编译器优化可操作的空间很小,到二代几乎就是极限了。

Ⅲ.新标准(前情参见c++11(一)的右值引用的使用场景部分)

这里补充一下整个过程:

③.c++11出现前后(有无移动构造与移动赋值),解决方案的对比

有移动构造与移动赋值以后,既确保的可读性(形式上与之前走拷贝构造的代码相同),也增加了效率。

④.哪些对象适合实现移动构造与移动赋值?

深拷贝的自定义类型不仅要把数据搬过来,还要涉及空间交换,因此开销很大,有必要实现移动构造和移动赋值。而浅拷贝的自定义类型的拷贝是逐字节拷贝,开销与移动构造和移动赋值相差不大,因此不需要实现。

3.引用折叠

那么折叠引用的规则就是:两次引用都必须是右值引用,才能让最终引用结果为右值引用。

用武之地:

当T为int& 时,对x引用的结果是左值引用 ;T为int&& 时,对x引用的结果是右值引用 。所以无论T是左值引用,还是优质引用,通过折叠引用,T&& x都能接收。而当T为普通类型 ,例如int时,不发生折叠引用,此时对x的引用就只是右值引用。

所以以后写函数模板的参数时,写一个T&&,就可以通过引用折叠,既可以实例化成左值版本,也可以实例化成右值版本,增加了通用性。

推导:

但在实际运用的过程中,是不需要传模板参数类型的,只需要给个实参,系统就能自动推导最终引用是哪一种引用。

4.完美转发

①.退化

②.完美转发

相关推荐
z200509301 小时前
【linux学习】深入理解 Linux 进程间通信:管道的艺术与实现
linux·开发语言
lcj25111 小时前
【stack、queue、deque、priority_queue】C++ 栈 / 队列 / 优先级队列全解析!手撕实现 + 二叉树层序遍历(附源码)
开发语言·c++·笔记
兵哥工控1 小时前
高精度微秒延时函数实现顺控工控项目实例
c++·mfc·硬件高精度计时器
j_xxx404_1 小时前
Linux线程池硬核解析:从固定线程池、单例线程池到线程安全、死锁与锁模型|附源码
linux·运维·服务器·c++·安全·ai
牛油果子哥q1 小时前
【C++静态成员】C++静态成员终极精讲:静态成员变量、静态成员函数、内存布局、对象共享机制、工程实战、深浅坑点与面试满分总结
c++·面试
奋斗的小方1 小时前
Java进阶篇1-2:泛型
java·开发语言·windows
晚风吹红霞1 小时前
深入剖析二叉搜索树:从原理到实现,从单key到key/value模型
c++
say_fall1 小时前
模拟量输入输出技术超详细知识点总结
linux·开发语言·嵌入式硬件·学习·php
我是一颗柠檬1 小时前
C++最全面复习:从入门到精通(2026年)
开发语言·c++·visualstudio