本节主要总结模板及其类模板分类以及STL里面的分配器、容器内部结构以及容器之间的关系和分类,还介绍了容器中List的结构分布
泛化(GP Generic Programming),特化(Specialization),二者区别在于特化版本相比泛化版本可能存在效率上的优化
所以每次申请的内存后系统分配给我们的远远大于我们实际申请的空间,因为系统要给这块内存附加一定的标识(也可叫做cooking或者额外开销),以方便释放操作,因为附加的部分是固定的,也就说我们申请的内存越大,附加部分占用的比重就越小。
注意:如果我们每次放入容器的元素太小,比如放一个long(4个字节),那内存产生的额外的开销将会很大,如果放入100万个,那额外开销可能比你放的100万个long还要多,内存消耗将会很可怕的。
由此可见,分配器的使用在释放时需要我们自己去记得当初申请了多少内存,显然是不方便的,但是我们在使用容器时不用关心,结论就是个人慎用。
用分配器而不直接用C RunTime Library提供的malloc函数,其本质上是减少内存的额外开销,也就是说分配器会预先开好一定的空间,尽量减少malloc的使用次数,它不是需要多少开多少,也就是我们常说的内存池设计。
容器间的关系,以及各个容器所占用的字节大小如下所示
G2.9版本,list的设计是双向环状链表,每个节点是一个指针,这个节点又由两个指针(一个向前指一个向后指)和数据部分data组成;
list整体数据部分是node,而node是list_node*类型,list_node是list的一个节点,所以list占用的内存大小是4(在32位机器上),当list从allocate拿内存时是以节点为单位的,也就是说除了数据data部分,还要有两个指针;
迭代器的操作要回到节点内部,而不是直接跳到下一个地址,比如迭代器++操作,就是要回到节点内部找到next指针指到的位置,然后再去挪动迭代器,迭代器的操作,都是一堆运算符重载
注意:c++语法不允许后++加两次,因为后加加操作符重载后返回的不是引用(后加加里面有临时变量)
注意:最新版本中,list数据部分(node节点)拆成了两个指针,list大小为两个指针的大小,为8(32位系统下)
转载于:https://www.cnblogs.com/laiyingpeng/p/11181320.html
