视频网站建设的背景简介,东莞网站排名提升,php企业网站源码推荐,设计网站界面摘要#xff1a;Linus Torvalds坦言那些狡诈的通过文件名查找高速缓存#xff0c;然后又抱怨自己能力一般的内核“恶魔”才是他欣赏的#xff1b;相反#xff0c;很多人连低水平的内核编程都还没学好。 几周前#xff0c; Linus Torvalds在Slashdot上回答了一些问题。其中…摘要Linus Torvalds坦言那些狡诈的通过文件名查找高速缓存然后又抱怨自己能力一般的内核“恶魔”才是他欣赏的相反很多人连低水平的内核编程都还没学好。 几周前 Linus Torvalds在Slashdot上回答了一些问题。其中有一条引发了开发者们的强烈关注当被问到他心目中的内核黑客时他说自己这些日子已经不怎么看代码了除非是帮别人审查。他稍微暂停了一下坦言那些“狡猾”的通过文件名查找高速缓存又抱怨自己能力一般的内核“恶魔”黑客才是他欣赏的。 他说 相反很多人连低水平的内核编程都还没学好。像lockless用名字查找name lookup功能即使不大也不复杂却是指针到指针的一个简单及良好的使用方法。比如我曾看见过许多人通过跟踪上一页条目删除一个单向链接的列表项然后删除该条目。例如 if (prev) prev-next entry-next; else list_head entry-next; 每当我看到这些的代码我会说“此人不了解指针”。这还是一个可悲的、常见的问题。 如果开发者能够理解指针只需要使用“指向该条目的指针”并初始化list_head然后贯穿列表此时无需使用任何条件语句即可删除该条目只需通过 *pp entry-next。 我想我理解指针但不幸的是如果要实现删除函数我会一直保持跟踪前面的列表节点。这里是代码草稿 不理解指针的人做法 typedef struct node { struct node * next; .... } node; typedef bool (* remove_fn)(node const * v); // Remove all nodes from the supplied list for which the // supplied remove function returns true. // Returns the new head of the list. node * remove_if(node * head, remove_fn rm) { for (node * prev NULL, * curr head; curr ! NULL; ) { node * next curr-next; if (rm(curr)) { if (prev) prev-next curr-next; else head curr-next; free(curr); } else prev curr; curr next; } return head; } 这个链表很简单但可以把每个节点的指针和sentinel值构建成了一个完美的结构体但是修改这个表的代码需要很精妙。难怪链表功能会常出现在许多面试环节中。 上面执行的代码是处理从列表头中删除任何节点所需的条件。 现在让我们好好记住Linus Torvalds执行代码。在这种情况下我们通过一个指针指向列表头来贯穿列表遍历修改。 Two star programming void remove_if(node ** head, remove_fn rm) { for (node** curr head; *curr; ) { node * entry *curr; if (rm(entry)) { *curr entry-next; free(entry); } else curr entry-next; } } 好多了最关键的部分在于链表中的链接都是指针因此指针到指针是修改链表的首选方案。 改进版的remove_if()是一个使用双重星号的例子双重星号象征着两重间接寻址再加一个星third star又会太过多余。 英文出自Wordaligned