Effective Modern C++ 之 优先选用make_unique和make_shared

我们知道make_unique和make_shared可以创建unique_ptr和shared_ptr。make_unique和make_shared底层实现是将其形参向待创建对象的构造函数作了一次完美转发,从一个new运算符产生的裸指针出发,构造了一个unique_ptr或shared_ptr,然后返回创建的这个unique_ptr或者shared_ptr。new运算符也可以创建对象,那么new运算符和make系列的函数创建的智能指针有什么区别呢?

  • 使用new的版本被创建的型别重复写了两遍,但是make系列的函数却没有。
  • 我们知道在运行器,传递给函数的实参必须在函数的调用被发起之前完成评估求值。使用make系列创建的智能指针往往是具有安全性的。而使用new 运算符可能会产生异常。
  • 使用make_shared可以提升性能,会让编译器有机会利用简洁的数据结构产生更小更快的代码。前面我们讲过shared_ptr底层要维护一个指涉到控制块的裸指针,这个控制块包含了指涉到该对象的引用计数。当我们使用make_shared来创建智能指针时,其会一次分配足够的内存(容纳指涉到对象内存的裸指针和指涉到控制块的裸指针),这种优化可以减少程序的静态尺寸和提高了可执行代码的速度。
  • make系列函数是不是在所有场景中都是适用的呢?当然不是的。
  1. 所有的make系列的函数都不会允许使用自定义的析构函数。
  2. 对于unique_ptr而言,其make系列的函数会在自定义析构器和大括号初始化物中产生问题。
  3. 对于shared_ptr,不建议使用make系列的函数的额外场景:第一,自定义内存管理的类。第二,内存紧张的系统,非常大的对象,以及存在比指涉到相同对象的shared_ptr生存期更久的weak_ptr。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值