对话Linus Torvalds:大多黑客甚至连指针都未理解
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:大多黑客甚至连指针都未理解相关推荐
- 《Linus Torvalds 自传》摘录
除了程序员,大概很少人知道Linux操作系统.它的发明者Linus Torvalds,知道的人就更少了.他本人也很低调,深居简出,很少出席公众场合或接受媒体采访,通常只在专业开发者的邮件列表中发言.提 ...
- Linus Torvalds:Linux背后的智者
编者的话:提起Linux之父Linus Torvalds,人们首先想到的是他的不近人情,总是听说他"炮轰"这个"炮轰"那个,却很难有机会接近他,了解他是个什么样 ...
- Linus Torvalds将中国亮相LinuxCon + ContainerCon + CloudOpen
本文讲的是Linus Torvalds将中国亮相LinuxCon + ContainerCon + CloudOpen[IT168 资讯]LF Asia宣布Linux和Git创始人Linus Torv ...
- 【IT资讯】Linus Torvalds:我们都老了,但Linux维护真的很难找
Linux 之父Linus Torvalds非常担忧没人继续维护内核:"真的很难找到维护者!" 在本周召开的Linux开源峰会与嵌入式大会上, VMware的首席开放源代码官Dir ...
- 与Linus Torvalds“并列”,虚拟化天才程序员法布里斯贝拉
摘要:谈起阿兰·图灵.高德纳.艾兹赫尔·戴克斯特拉,我们并不陌生,这些振聋发聩名字背后是颠覆了人类生活的现代计算机工业.然而有些人的荣誉却远低于他的贡献,比如Fabrice,过去20年最闪亮和最有影响 ...
- Linus Torvalds:我们都老了,但Linux维护者真的很难找
Linux 之父Linus Torvalds非常担忧没人继续维护内核「真的很难找到维护者!」 在本周召开的Linux开源峰会与嵌入式大会上, VMware的首席开放源代码官Dirk Hohndel和 ...
- Linus Torvalds的安全性,Facebook的AI工具等
在本周的开源新闻综述中,我们将看看开放数据还不是那么开放,Facebook将更多工具作为开源发布,以及更多! 开源新闻让您阅读愉快. 2015年1月17日至1月23日 万维网基金会发布第二份开放数据晴 ...
- 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 发行版的 ...
- 【《Linus Torvalds自传-Linux OS 之父》摘录】
who is Linus Torvalds? 大......大......大.....神......神......神!请收下我的小膝盖! 今天在GitHub上偶然读到一本书<Just for F ...
最新文章
- 收藏!工作中Git使用实践和常用命令流程合集
- cocos2dx3.4 VS2012无法打开包含文件extensions/ExtensionExport.h
- 使用easyexcel导入时间数据转换成Data的坑
- css 设置其它标签,有没有办法将CSS样式设置为特定输入类型的标签?
- Qt之线程同步(生产者消费者模式 - QSemaphore)
- 信息学奥赛一本通C++语言——1102: 与指定数字相同的数的个数
- C语言-数据结构-单链表的初始化,插入和输出
- 光盘版linux6,光盘上的系统 Slax Linux 6.0.6新版
- oracle 主键自增函数_Oracle数据库中创建自增主键的实例教程
- 【机器学习】Pima数据探索--七种武器
- paip.提升用户体验------c++ Qt5 实现程序图标以及动态托盘闪烁图标
- iOS category内部实现原理
- sd卡 格式化 命令 linux,在Linux命令行上格式化SD卡、USB驱动器、闪存驱动器的方法...
- 测试开发:Docker常用命令分享
- 非常不错的编程技术教程
- Qt绘制曲线图(基于qt画图QPainter)
- 使用ar_receipt_api_pub.apply失误
- LeetCode 876、链表的中间结点
- BHQ-2胺是一种暗猝灭剂,BHQ-2 amine,1241962-11-7可与目标底物或含有羧酸盐部分的生物分子结合
- XML之父拒绝甲骨文橄榄枝 加盟谷歌Android【转载】