zoukankan      html  css  js  c++  java
  • duang!!!为什么函数能够返回unique_ptr

    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对象能够被函数返回。

  • 相关阅读:
    wex5 实战 框架拓展之2 事件派发与data刷新
    wex5 实战 框架拓展之1 公共data组件(Data)
    wex5 实战 HeidiSQL 导入Excel数据
    wex5 实战 手指触屏插件 hammer的集成与优劣
    wex5 实战 登陆帐号更换与用户id一致性
    wex5 实战 用户点评与提交设计技巧
    wex5 实战 省市县三级联动与地址薄同步
    wex5 实战 wex5与js的组件关系与执行顺序(父子与先后)
    wex5 实战 单页模式下的多页面数据同步
    [BZOJ]4237: 稻草人
  • 原文地址:https://www.cnblogs.com/llguanli/p/8439410.html
Copyright © 2011-2022 走看看