2019独角兽企业重金招聘Python工程师标准>>>

几周前, 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)又会太过多余。

转载于:https://my.oschina.net/chenshouyong/blog/101447

对话Linus Torvalds:大多黑客甚至连指针都未理解相关推荐

  1. 《Linus Torvalds 自传》摘录

    除了程序员,大概很少人知道Linux操作系统.它的发明者Linus Torvalds,知道的人就更少了.他本人也很低调,深居简出,很少出席公众场合或接受媒体采访,通常只在专业开发者的邮件列表中发言.提 ...

  2. Linus Torvalds:Linux背后的智者

    编者的话:提起Linux之父Linus Torvalds,人们首先想到的是他的不近人情,总是听说他"炮轰"这个"炮轰"那个,却很难有机会接近他,了解他是个什么样 ...

  3. Linus Torvalds将中国亮相LinuxCon + ContainerCon + CloudOpen

    本文讲的是Linus Torvalds将中国亮相LinuxCon + ContainerCon + CloudOpen[IT168 资讯]LF Asia宣布Linux和Git创始人Linus Torv ...

  4. 【IT资讯】Linus Torvalds:我们都老了,但Linux维护真的很难找

    Linux 之父Linus Torvalds非常担忧没人继续维护内核:"真的很难找到维护者!" 在本周召开的Linux开源峰会与嵌入式大会上, VMware的首席开放源代码官Dir ...

  5. 与Linus Torvalds“并列”,虚拟化天才程序员法布里斯贝拉

    摘要:谈起阿兰·图灵.高德纳.艾兹赫尔·戴克斯特拉,我们并不陌生,这些振聋发聩名字背后是颠覆了人类生活的现代计算机工业.然而有些人的荣誉却远低于他的贡献,比如Fabrice,过去20年最闪亮和最有影响 ...

  6. Linus Torvalds:我们都老了,但Linux维护者真的很难找

    Linux 之父Linus Torvalds非常担忧没人继续维护内核「真的很难找到维护者!」 在本周召开的Linux开源峰会与嵌入式大会上,  VMware的首席开放源代码官Dirk Hohndel和 ...

  7. Linus Torvalds的安全性,Facebook的AI工具等

    在本周的开源新闻综述中,我们将看看开放数据还不是那么开放,Facebook将更多工具作为开源发布,以及更多! 开源新闻让您阅读愉快. 2015年1月17日至1月23日 万维网基金会发布第二份开放数据晴 ...

  8. Linus Torvalds 在 22 号宣布Linux 5.18发布

    Linus Torvalds 在 22 号宣布Linux 5.18发布 https://lkml.org/lkml/2022/5/22/274 Linux 5.18 作为 GNU/Linux 发行版的 ...

  9. 【《Linus Torvalds自传-Linux OS 之父》摘录】

    who is Linus Torvalds? 大......大......大.....神......神......神!请收下我的小膝盖! 今天在GitHub上偶然读到一本书<Just for F ...

最新文章

  1. 收藏!工作中Git使用实践和常用命令流程合集
  2. cocos2dx3.4 VS2012无法打开包含文件extensions/ExtensionExport.h
  3. 使用easyexcel导入时间数据转换成Data的坑
  4. css 设置其它标签,有没有办法将CSS样式设置为特定输入类型的标签?
  5. Qt之线程同步(生产者消费者模式 - QSemaphore)
  6. 信息学奥赛一本通C++语言——1102: 与指定数字相同的数的个数
  7. C语言-数据结构-单链表的初始化,插入和输出
  8. 光盘版linux6,光盘上的系统 Slax Linux 6.0.6新版
  9. oracle 主键自增函数_Oracle数据库中创建自增主键的实例教程
  10. 【机器学习】Pima数据探索--七种武器
  11. paip.提升用户体验------c++ Qt5 实现程序图标以及动态托盘闪烁图标
  12. iOS category内部实现原理
  13. sd卡 格式化 命令 linux,在Linux命令行上格式化SD卡、USB驱动器、闪存驱动器的方法...
  14. 测试开发:Docker常用命令分享
  15. 非常不错的编程技术教程
  16. Qt绘制曲线图(基于qt画图QPainter)
  17. 使用ar_receipt_api_pub.apply失误
  18. LeetCode 876、链表的中间结点
  19. BHQ-2胺是一种暗猝灭剂,BHQ-2 amine,1241962-11-7可与目标底物或含有羧酸盐部分的生物分子结合
  20. XML之父拒绝甲骨文橄榄枝 加盟谷歌Android【转载】

热门文章

  1. 笔记:C++重载++前后区分
  2. mysql 以数组的形式插入更新表
  3. python在windows安装paramiko模块
  4. 一个鉴黄师的产品之路(11-12更新)
  5. 18亿用户、10万条电源线、4200万月活......创业者的底限究竟在哪里?
  6. 【产品干货】Uber产品经理首次在中国自述产品理念:我们看中的并非只是钱
  7. C++ STL vector(向量)
  8. fsLayui缓存使用
  9. 安天365第二期线上交流
  10. vue学习记录: 遇到过的问题记录