当我问及一些同行的朋友对于服务器程序中STL的使用情况的时候,他们都回答在自己公司的服务器程序开发中,一般都不使用STL。
为何标准库在服务器程序开发环境中受到冷遇呢?我觉得在服务器程序这种高稳定性、高性能、高并发的环境下,STL存在着三大问题。
问题一:不能确定STL如何管理内存。假设就按照STL默认的方法来管理内容,则服务器在长时间的分配和释放内存后,容易导致内存碎片,对服务器的稳定有影响。然而,如果没有阅读过STL的源码,谁又能确切地得知STL是如何管理内存的呢?虽然可以在STL中使用自己的分配器,又能够确认STL的某些部分不会在分配器之外进行内存分配呢?
当然,内存管理问题不是STL带来的问题,任何服务器程序本身都要考虑这个问题。原因在极少有人去阅读STL的源码,去了解STL的内部实现机理。因为不了解,所以怀疑;因为怀疑,所以不轻易使用。
问题二:不能确定STL在海量数据下的表现。服务器一般都是海量的内存,为了提高性能大量数据保存在内存中。在非常大的规模的数据下,STL一定能够满足稳定性和效率的需求吗?
问题三:不能确定STL在多线程环境下的表现。以上的内存和规模的问题可以通过加深对STL的了解和测试来解决,但是多线程下的并发问题就不是那么容易解决了。STL不是线程安全的,在多线程环境下,对STL容器的操作都要加锁来确保正确。然后,部分高性能的场合,需要对“读-读”条件下并发进行优化,以及某些锁无关的特殊条件可以不加锁,甚至是采用流行的RCU机制…………在这个倡导多核和并发的时代,STL显得有些落后了。
当然,STL仍然是非常优秀的库。内存管理、海量数据以及并发的问题,就算不使用STL,在自己实现的库中也同样会面临这些问题。同时,我们也期待多线程环境下的一个标准库能够出现,站在巨人的肩上快速的构建应用。