【发布时间】:2020-05-12 20:18:40
【问题描述】:
我可能错了,但继续查看 <linux/list.h> 中的代码,我发现像 list_for_each_entry_safe 这样的宏从第二个元素开始:
#define list_for_each_entry_safe(pos, n, head, member) \
for (pos = list_entry((head)->next, typeof(*pos), member), \
n = list_entry(pos->member.next, typeof(*pos), member); \
&pos->member != (head); \
pos = n, n = list_entry(n->member.next, typeof(*n), member))
注意循环以pos = list_entry((head)->next开头。
我知道这可能听起来很挑剔,但在 Python 中的“真正”foreach 中你从第一个或第 0 个元素开始。
在内核中违反这个约定有什么特别的原因吗? 是出于性能原因吗?
还是我对上述代码的理解完全错误?
【问题讨论】:
-
避免使用特殊代码处理空列表的一种常用技术是使用与列表中的数据不对应的 header 节点。
-
也避免了删除列表第一个元素时出现的问题。
-
@0andriy:是什么让你认为这是一个双向链表?
-
@ScottHunter,你读过 OP 中的文字吗?您是否通过链接阅读了答案?我怀疑“不”和“不”。
标签: c linux foreach linked-list linux-kernel