程序,就是一堆逻辑加上一堆数据。由一堆逻辑去处理一堆数据,根据用户的输入,对相应的数据进行分析、处理、输出(从程序界面上、或文件中)。
C++语言中的模板,体现的就是数据与逻辑分离的哲学。只要使用模板,只要写一份逻辑代码,就可以根据不同的数据类型可以实现对不同数据的处理。
STL同样如此。所有的容器只负责保存数据,而不用管此数据到底是char、int、struct、还是object;反正保存的都是数据。所有的STL中的算法不管其操作的对象是什么,数据类型是什么,算法就只管实现这个算法的逻辑。功能和职责完全分离。
STL哲学的思想非常不错。但我们同样可以在其上面再抽象一点。容器仅仅负责保存数据,取数据,而不管数据如何是按什么顺序和原则保存的。
所有的容器里面的数据都用数组保存(这个牵涉到CPU二级缓存的设计问题,使用数组在效率上可以提高上百倍)。所有的容器只有一份代码,而不管它保存的是什么数据类型。
迭代器保存仅仅是一个容器的某个元素的位置信息。只有迭代器保存着数据类型信息。
STL最失败的地方在于,需要为每一份数据类型生成一份完整的代码。每添加和删除一个数据,需要进行new 和delete操作。new和delete操作,是由系统去找一块内存,由于内存颗粒太小,导致不管是对整个操作系统的内存管理,还是对容器数据的访问效率都会非常底。因此,2个失败的地方,代码太多(为每一种数据类型生成一份代码,整个程序编译出来的代码很大),效率太低(整个容器中的对象分布在不同的地方,二级缓存命中率狂低。)。
我的理想,重写STL。
容器中,只负责保存,一个对象大小(一个对象多少字节)、在哪个位置插入一个对象、交换2个对象。
所有的对象都保存在一个数组中。迭代器保存的就是当前对象在容器中的位置(数组下标)。
我写的代码里,容器里,只有一个元素大小、当前元素个数、当前容器大小、整个元素数组的首地址等基本数据。
有时间再完善整个设计和代码吧!
浙公网安备 33010602011771号