标签:for 内核 logs 目标 com 头结点 entry pre bsp
1. DTLib中双向链表的设计思路
(1)数据结点之间在逻辑上构成双向循环,这有别于Linux内核链表的实现。
(2)头结点仅用于结点的定位,而Linux内核链表是将头结点作为循环的一部分。
2. 实现思路
(1)通过模板定义DualCircleList类,继承自DualLinkList类
(2)在DualCircleList内部使用Linux内核链表进行实现(另类实现)
(3)使用struct list_head定义DualCircleList的头结点
(4)特殊处理:循环遍历时忽略头结点
3. 实现要点
(1)通过list_head进行目标结点定位(position(i))
(2)通过list_entry将list_head指针转换为目标结点指针
(3)通过list_for_each实现int find(const T& e)函数
(4)遍历函数中的next和prev需要考虑跳过头结点
【编程实验】基于Linux内核链表的双向循环链表
//DualCircleList.h
4.思考题:pn1==pn2吗?
struct Node : public Object //注意Object是个虚基类 { list_head head; T value; }; Node node; list_head* ld = &node.head; Node* pn1 = reinterpret_cast<Node*>(ld); //error, 遗漏了虚函数表指针字段 Node* pn2 = list_entry(ld, Node, head); //ok
5. 小结
(1)Linux内核链表是带头结点的双向循环链表
(2)DualCircleList使用Linux内核链表进行内部实现
(3)DualCircleList在循环遍历时需要跳过头结点
(4)将list_head指针转换为目标结点指针时,使用list_entry宏。
标签:for 内核 logs 目标 com 头结点 entry pre bsp
原文地址:http://www.cnblogs.com/5iedu/p/7152536.html