您的位置: 旅游网 > 影视

对话LinusTorvalds大多黑客甚

发布时间:2019-08-15 13:52:20
对话Linus Torvalds:大多黑客甚至连指针都未理解 几周前, Linus Torvalds在Slashdot上回答了一些问题。其中有一条引发了开发者们的强烈关注,当被问到他心目中的内核黑客时,他说自己这些日子已经不怎么看代码了,除非是帮别人审查。他稍微暂停了一下,坦言那些狡猾的通过文件名查找高速缓存又抱怨自己能力一般的内核恶魔(黑客)才是他欣赏的。 他说: 相反,很多人连低水平的内核编程都还没学好。像lockless用名字查找(name lookup)功能即使不大也不复杂,却是指针到指针的一个简单及良好的使用方法。比如,我曾看见过许多人通过跟踪上一页条目删除一个单向链接的列表项,然后删除该条目。例如: if(prev) prev-next=entry-next; else list_head=entry-next; 每当我看到这些的代码,我会说:此人不了解指针。这还是一个可悲的、常见的问题。 如果开发者能够理解指针,只需要使用指向该条目的指针并初始化list_head,然后贯穿列表,此时无需使用任何条件语句即可删除该条目,只需通过 *pp = entry-next。 我想我理解指针,但不幸的是,如果要实现删除函数,我会一直保持跟踪前面的列表节点。这里是代码草稿: 不理解指针的人做法: typedefstructnode { structnode*next; .... }node; typedefbool(*remove_fn)(nodeconst*v); //Removeallnodesfromthesuppliedlistforwhichthe //suppliedremovefunctionreturnstrue. //Returnsthenewheadofthelist. node*remove_if(node*head,remove_fnrm) { 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; } returnhead; } 这个链表很简单,但可以把每个节点的指针和sentinel值构建成了一个完美的结构体,但是修改这个表的代码需要很精妙。难怪链表功能会常出现在许多面试环节中。 上面执行的代码是处理从列表头中删除任何节点所需的条件。 现在,让我们好好记住Linus Torvalds执行代码。在这种情况下,我们通过一个指针指向列表头来贯穿列表遍历修改。 Two star programming: voidremove_if(node**head,remove_fnrm) { 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冠心病心绞痛治疗原则
丁桂薏芽健脾凝胶成分
老人通经活络吃什么药
幽门螺旋杆菌感染会传染吗
猜你会喜欢的
猜你会喜欢的