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。
发布了78 篇原创文章 · 获赞 11 · 访问量 5075

猜你喜欢

转载自blog.csdn.net/qq_43145594/article/details/104244074