目录:
Move和Forward? 闭包,functor,bind,lamada 智能指针 auto, std::atomic, emplace,nullptr
正文:
1 Move和Forward : 1) 引用(左值) a) 取地址和取引用的区别?? char *s; char &p=s; 地址符在左边是引用. 地址符在右边是取地址. b) 传值,传引用和传指针区别? 看子函数定义,是指针类型就是传指针。非指针类型,带地址的就是传引用。 实例请参考:https://www.cnblogs.com/happying30/p/9484860.html 2)?move: C++11朝码夕解: move和forward:https://zhuanlan.zhihu.com/p/55856487 a)说明了为什么引入move? 为了解决临时变量产生的浪费。比如:通常交换a和b:temp=a;a=b;b=temp;销毁temp. move的思想是temp指向a,a指向b,然后b指向temp即原来的a地址。整个过程不发生拷贝。 b)什么是左值,右值? 原来的引用就是左值,T&.? 上面实例中的临时变量就是右值,T&&(赋值语句的右边也可以使用引用了) c)?引用折叠 i. A& &变成A&;ii. A& &&变成A&. iii. A&& &变成A& iv. A&& &&变成A&& 3) Forward? Forward包括两种情况,可以自动识别传入的是左值还是右值。包括了move处理右值的功能。 实例参见:https://www.cnblogs.com/yfceshi/p/7122251.html? 传值就是按照左值处理,传变量按照右值处理. 4) 移动赋值函数和移动构造函数 两者都应用右值功能避免了拷贝
2?闭包,functor,bind,lamada 1) 闭包:是一个集合. 通常的函数使用的变量都是在自己内部定义的, 具有闭包特性的函数扩展了。它可以使用函数外定义的变量而不会出错. 所以实现函数+它使用的外部变量,两者构成了闭包。 闭包实现形式有functor,bind,lamada. functor: 是一种类,但是可以函数使用方法(算类的构造函数吗?),可以使用外部变量. bind: 参数1执行函数,其他参数是外部变量。组成了闭包。它已经被lamada代替了。 lamada:匿名函数。它根据不同参数,可以使用外部变量。 2)闭包函数与普通函数的不同使用方法.
下面blog的“从语法上看如何捕获外部变量”的例子,说明了怎么使用外部变量. C/C++语言中闭包的探究及比较?https://coolshell.cn/articles/8309.html. functor,bind,lamada 使用实例请参考: C++中闭包的使用?https://blog.csdn.net/mo_yin/article/details/87532722. 上面的例子是常用的使用方法.有个基本了解. 下面的blog是详细全面的使用方法。按照定义,作用,使用实例(各种情况)介绍,写的逻辑性比较好。 C++11 中的std::function和std::bind:https://www.jianshu.com/p/f191e88dcc80
3 智能指针
3.1 作用:指针离开作用域,可以自动销毁内存.多个指针指向一个内存,p1=p2,p1释放,p2使用出错.c.get 访问智能指针的裸指针. 原理:析构函数里调用delete。这样在构造函数new,在析构函数delete。防止了内存泄漏。 智能指针封装了上面的过程,同时在析构函数增加了引用计数判断,等于0删除,否则不删. 一般公司会封装智能指针. 3.2 shared_ptr and weak_ptr ?区别? std::shared_ptr,智能指针,存在引用计数. 强指针为0才会被析构 std::weak_ptr,弱引用,用于解决强指针的互相引用(无法释放,一直都有引用计数.类似死锁).原理是弱指针不为0也会析构,避免了互指不能释放的情况. 3.3 unique_ptr和shared_ptr之间的差异? 两者都是智能指针,自动析构。 shared_ptr 有引用计数,可以多个对象同时指向一个指针。 unique_ptr 只能一个对象使用,不用写free自动析构,unique_ptr 更原始一些.
4?other:auto, std::atomic, emplace,nullptr
?std::atomic:原子类型对象的主要特点就是从不同线程访问不会导致数据竞争(data?race) auto是正向推导,decltype是反向推导.https://my.oschina.net/wangxuanyihaha/blog/183151
?emplace = insert 不创建临时变量。c++11很多都是用新函数,不创建临时变量
|