关于对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的原因。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值