本文源码以GNU2.9编译器为例展开说明,同时参考一下GNU4.9的部分源码。
1 list主要源码和数据结构
1.1 GNU2.9源码结构
1.2 GNU4.9源码结构
1.2.1 _List_node_base
1.2.2 _List_node
因此,一个list<T>
实例的size为24个字节(考虑内存对齐)。
2 iterator迭代器
list的迭代器本质上是一个class,单纯从list这种数据结构本身来看,list的遍历不能通过next指针++的方式对list元素进行遍历–list的存储空间为链表,其内存空间不是连续的,因此不能使用next指针++的方式推动指针指向下一个元素,因此需要封装list迭代器iterator为一个class类,使变成一个智能的“指针”,可以通过iterator++就可以实现指向下一个元素(list的iterator迭代器正是通过重载++运算符实现到链表node中找到next指针,以实现++操作)
2.1 operator++操作符重载
2.2 operator*操作符重载![在这里插入图片描述](https://img-blog.csdnimg.cn/53d1f7815bef4c3b82af360a5c068085.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6auY6Ieq5by655qE5Y2a5a6i,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
2.3 GNU4.9源码结构
因此,list<T>::iterator
实例的size为8个字节。
3 参考材料
- 侯捷《STL标准库和泛型编程》