STL之争

STL向来是一个有争议的话题。

最初接触STL的时候,给人眼前一亮的是,STL实现了数据结构和算法的分离,这也是STL设计的核心思想。

在实现上,STL源代码也是能够给人一些启发的。比如sort算法的实现(这应该不是STL的开创),sort主要采用快速排序,对于初步有序的短系列,采用插入排序,对于快速排序的极端情况,还可能使用堆排序。

性能方面,STL作为通用库,一般来说效率还是比较高的。但是,在大型游戏领域和内存受限领域,以及由于STL在不同平台上的实现不同,其性能还需要改进。关于这一点,可以参考http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html这篇论文,论文还提供了一个性能对比图。

扩展性上,个人认为,仿函数,适配器还是有比较好的扩展性,Allocator(1998 ISO C++)则争议很大,上述论文和http://www.openstd.org/jtc1/sc22/wg21/docs/papers/2005/n1850.pdf这篇论文有比较详细的解释。

易用性上,STL同样备受争议。这主要表现在:
(1)需要对库的实现有相当的理解,由于依赖于模版与泛型,然后又加上C++语言,滥用极可能带来性能的严重损失,难以发现的一些Bug等。
(2)调试的不方便,源码也缺乏文档和注释。
(3)一些局部的瑕疵, 比如缺少像树这种层级结构的容器,比如list的sort函数也违背了数据结构和算法的分离思想。

总而言之,作为通用库,STL还是比较不错的,而在某些对性能要求更高的领域,最好慎用。

对STL的改进和替换方面方面,可以参考:
EASTL: EASTL依然沿用STL的基本思想,在实现上改进了STL,是一个性能更高,更易于调试的STL。
Doom3: 完全抛弃了迭代器,是一个比较简单,但是非常实用的STL。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.