关于对STL容器,迭代器,泛型算法,内存配置的总结性思考
源码之前,了无秘密。前两个月读完了STL源码剖析这本书,深感侯捷大师的深厚功底,使我对STL的编程思维有了深切的体会,当时及时记录下了自己的所思所想,今天将它分享给大家,希望大家能从中受益,也希望大神能给我一些指教。
发这篇博客的原因是我有一天做了一个很有趣的实验:
vector<bool>vec1(8,true);
vector<char>vec2(16,1);
vector<int>vec3(16,1);
cout<<sizeof(vec1)<<endl;
cout<<sizeof(vec2)<<endl;
cout<<sizeof(vec3)<<endl;
bool类型占1个字节,char占1个字节,int占4个字节主观上我相信很多人是会认为会输出8,16,64,我一开始也这么认为,但是结果,输出的全是48。然后我想,是不是跟内存对齐有关系,然后我把所有的数字放大了十倍。
vector<bool>vec1(80,true);
vector<char>vec2(160,1);
vector<int>vec3(160,1);
cout<<sizeof(vec1)<<endl;
cout<<sizeof(vec2)<<endl;
cout<<sizeof(vec3)<<endl;
大家可能心想这次总会突破内存对齐的限制,结果输出,仍然是48。
后来我读到了STL中vector容器部分,才豁然开朗。
原因是vector只是个模板类,vec只是个模板类对象,它的内部是固定的成员函数和成员变量,它内部维持着一个内置指针,来保存储存的数据,因此不管储存了多少字节的数据,vec拥有的都只是该指针的字节数。
STL中说,设计STL某一容器的人也要设计相应的迭代器,因为在设计迭代器的时候暴露了该容器中太多的细节,索性就交给设计者一同设计。迭代器负责辅助容器进行遍历、取值等操作,相当于一个多功能的指针。迭代器又是容器和泛型算法之间的粘合剂,泛型算法只接受迭代器,通过迭代器完成对相应容器的算法操作。然后内存配置器allocator就负责给容器从内存池中分配内存空间,从最底层来支持整个STL的运转。
STL容器就是我们人本身,迭代器就是我们的手脚头眼耳等器官,泛型算法就是一个个武功秘籍(葵花宝典除外),内存配置器就好比是身外之物(地位,金钱,学识,朋友等)。我们在武功秘籍的指导下,运用我们的四肢五官,去获得金钱和地位等,但我们肉体本身是没有丝毫增减的。这就是sizeof(vec)永远等于48的原因。