C++虐我千百遍,我待C++如初恋


从智能指针说起
对高手而言。指针是上天入地的神器。对新手而言,那简直是灾难的源泉。高级语言如Java,C#都自己主动管理内存。你仅仅管new。不必担心内存释放问题。Bjarne StroustrupC觉得++增加垃圾回收机制将做不适合系统底层的开发,为此C++提倡使用RAII来管理资源。

auto_ptr就是依据这样的理念而诞生的智能指针,本意是想编写个效率接近原生指针,但具有资源全部权安全的智能指针。当发生赋值,拷贝构造时,全部权就发生转移。

这就显的非常鸡肋,不能放入STL容器中,由于它的拷贝构造和传统的拷贝构造不一样。


unique_ptr代替auto_ptr
C++11的右值引用和move语义攻克了这个问题,于是乎unique_ptr代替auto_ptr。

为什么unique_ptr能够放入容器呢?如:

vector<unique_ptr<Song>> v;
v.push_back(unique_ptr<Song>(new Song("B'z","Juice")));

答案是unique_ptr能够move,不能copy。它没有拷贝构造。拷贝赋值,可是有move构造,move赋值。

虽然能够放入容器内,但不是全部函数都是能够用的。当然了,必要的时候能够使用std::move来将左值转化为右值。


如今。有这么一个问题。unique_ptr没有copy函数,那么。函数是怎样返回unique_ptr的呢?比方C++14就有个make_unique的模板函数返回了unique_ptr。我们来看看他的实现:
template<class T,     class... Types>
unique_ptr<T> make_unique(Types&&... Args)
{
    return (unique_ptr<T>(new T(forward<Types>(Args)...)));   
}
这个函数会调用拷贝构造吗,一開始我也非常迷惑,经过一番查找之后。基本能够确认不会调用拷贝构造。


RVO和NRVO
当函数返回一个对象时。理论上会产生暂时变量。那必定是会导致新对象的构造和旧对象的析构,这对效率是有影响的。

C++编译针对这样的情况同意进行优化,哪怕是构造函数有副作用。这叫做返回值优化(RVO),返回有名字的对象叫做具名返回值优化(NRVO),就那RVO来说吧,本来是在返回时要生成暂时对象的。如今构造返回对象时直接在接受返回对象的空间中构造了。如果不进行返回值优化。那么上面返回unique_ptr会不会有问题呢?也不会。由于标准同意编译器这么做:

1.假设支持move构造,那么调用move构造。
2.假设不支持move。那就调用copy构造。
3.假设不支持copy,那就报错吧。

显然的。unique_ptr是支持move构造的,unique_ptr对象能够被函数返回。

最新文章

  1. MRC下多个对象的内存管理
  2. docker私有库UI和添加私有库到本机能够push和pull
  3. kibana 搜索提示挡住输入框
  4. 介绍Oedis - Redis OH/RM
  5. java设计模式设计模式
  6. (转)winform Form 淡入淡出效果
  7. python 对数函数
  8. Little Busters! — 并查集
  9. [javascript]js修改title
  10. C语言的本质(11)——指针与数组
  11. C++反汇编第四讲,反汇编中识别继承关系,父类,子类,成员对象
  12. Javascript介绍(了解)
  13. 信息检索中的TF/IDF概念与算法的解释
  14. Java中的按位运算
  15. EF select 匿名类 问题
  16. 万能Makefile,前戏做足项目做起来才顺畅。
  17. 多模块项目提示“Module ** must not contain source root **. The root already belongs to module **”的解决办法
  18. 爬虫--Scrapy-持久化存储操作2
  19. 学以致用十八-----shell脚本之基础概念及变量
  20. python3.4学习笔记(十) 常用操作符,条件分支和循环实例

热门文章

  1. STL之效率比較
  2. windows、linux劫持技术
  3. Deming管理系列(1)——开车仅仅看后视镜
  4. Linux less命令简介
  5. 深入浅出VGA和DVI接口
  6. iis 部署
  7. Memched——C#操作
  8. Tomcat 初探(二) server.xml 配置
  9. 浅谈SpringCloud (三) Ribbon负载均衡
  10. Element-ui组件--pagination分页的使用