这种“重新设计”会带来哪些影响呢?前文已经陆续提到了一些,下面我们做一个总结:
对于用户代码来说,几乎没有影响:Vector
性能方面也几乎没有损失,原因在第5章中已经讨论过:在使用非调试级别的优化选项编译的代码中,通过 std::unique_ptr
实现变得更加简洁:指令更少、无需显式异常处理代码,更多成员函数可以直接使用 = default。
隐式内存管理实现的一个重要优势是它具备异常安全性,即使没有显式的 try 和 catch 块也是如此。这在很多场景中非常重要:例如,可能处于一个不允许抛出异常的环境中,但又不得不使用一个可能会抛出异常的库;或者在一个内存受限的环境中调用 operator new()。在这些情况下,隐式内存管理实现非常安全,而一个没有异常处理机制的手动内存管理实现则不会这么“幸运”。
综上所述,实现一个自定义删除器并将其用于 Vector<T> 是一项值得的投资。
你可能会好奇,这种设计思路是否也适用于基于节点的容器?为了回答这个问题,我们将通过回顾第12章中的简单 ForwardList<T> 实现来进一步探讨这一问题。