對話Linus Torvalds:大多黑客甚至連指針都未理解

摘要:Linus Torvalds坦言那些狡詐的通過文件名查找高速緩存,然后又抱怨自己能力一般的內核“惡魔”才是他欣賞的;相反,很多人連低水平的內核編程都還沒學好。

幾周前, Linus Torvalds在Slashdot上回答了一些問題。其中有一條引發了開發者們的強烈關注,當被問到他心目中的內核黑客時,他說自己這些日子已經不怎么看代碼了,除非是幫別人審查。他稍微暫停了一下,坦言那些“狡猾”的通過文件名查找高速緩存又抱怨自己能力一般的內核“惡魔”(黑客)才是他欣賞的。

他說:

相反,很多人連低水平的內核編程都還沒學好。像lockless用名字查找(name lookup)功能即使不大也不復雜,卻是指針到指針的一個簡單及良好的使用方法。比如,我曾看見過許多人通過跟蹤上一頁條目刪除一個單向鏈接的列表項,然后刪除該條目。例如:

  1. if?(prev) ?
  2. ????prev->next?=?entry->next; ?
  3. else ?
  4. ????list_head?=?entry->next;?

每當我看到這些的代碼,我會說:“此人不了解指針”。這還是一個可悲的、常見的問題。

如果開發者能夠理解指針,只需要使用“指向該條目的指針”并初始化list_head,然后貫穿列表,此時無需使用任何條件語句即可刪除該條目,只需通過 *pp = entry->next。

我想我理解指針,但不幸的是,如果要實現刪除函數,我會一直保持跟蹤前面的列表節點。這里是代碼草稿:

不理解指針的人做法:

  1. typedef?struct?node ?
  2. { ?
  3. ????struct?node?*?next; ?
  4. ????.... ?
  5. }?node; ?
  6. ?
  7. typedef?bool?(*?remove_fn)(node?const?*?v); ?
  8. ?
  9. //?Remove?all?nodes?from?the?supplied?list?for?which?the? ?
  10. //?supplied?remove?function?returns?true. ?
  11. //?Returns?the?new?head?of?the?list. ?
  12. node?*?remove_if(node?*?head,?remove_fn?rm) ?
  13. { ?
  14. ????for?(node?*?prev?=?NULL,?*?curr?=?head;?curr?!=?NULL;?) ?
  15. ????{ ?
  16. ????????node?*?next?=?curr->next; ?
  17. ????????if?(rm(curr)) ?
  18. ????????{ ?
  19. ????????????if?(prev) ?
  20. ????????????????prev->next?=?curr->next; ?
  21. ????????????else ?
  22. ????????????????head?=?curr->next; ?
  23. ????????????free(curr); ?
  24. ????????} ?
  25. ????????else ?
  26. ????????????prev?=?curr; ?
  27. ????????curr?=?next; ?
  28. ????} ?
  29. ????return?head; ?
  30. }?

這個鏈表很簡單,但可以把每個節點的指針和sentinel值構建成了一個完美的結構體,但是修改這個表的代碼需要很精妙。難怪鏈表功能會常出現在許多面試環節中。

上面執行的代碼是處理從列表頭中刪除任何節點所需的條件。

現在,讓我們好好記住Linus Torvalds執行代碼。在這種情況下,我們通過一個指針指向列表頭來貫穿列表遍歷修改。

Two star programming:

  1. void?remove_if(node?**?head,?remove_fn?rm) ?
  2. { ?
  3. ????for?(node**?curr?=?head;?*curr;?) ?
  4. ????{ ?
  5. ????????node?*?entry?=?*curr; ?
  6. ????????if?(rm(entry)) ?
  7. ????????{ ?
  8. ????????????*curr?=?entry->next; ?
  9. ????????????free(entry); ?
  10. ????????} ?
  11. ????????else ?
  12. ????????????curr?=?&entry->next; ?
  13. ????} ?
  14. }?

好多了!最關鍵的部分在于:鏈表中的鏈接都是指針,因此指針到指針是修改鏈表的首選方案。

改進版的remove_if()是一個使用雙重星號的例子,雙重星號象征著兩重間接尋址,再加一個星(third star)又會太過多余。

英文出自:Wordaligned

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449770.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449770.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449770.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

總結學習(提綱)

之前在私募做期權量化學習了那么久,趁著畢業找工作這段時間,對之前學習的東西,制作的函數等進行一個系統性的總結,順便每天更新的時候,記錄下自己的體重與波比跳次數。 1.MC的學習與策略編寫 2.python基礎學習資料的…

安卓系統上的遠程 JS 調試 Remote JavaScript Debugging on Android

每當在 Android 移動設備上調試網頁時,開發人員往往都會不自覺陷入調試的泥潭中去。《Android開發指南》提供了一個解決方案,卻有點繁瑣復雜。因此,許多 Web 開發人員會傾向于使用類似 Firefox Firebug 的或像 WebKit 的 Web Inspector 之類的…

js關于表單校驗完善

<!DOCTYPE html><html> <head> <meta charset"UTF-8"> <title>注冊頁面</title> <style type"text/css"> .left{ width: 100px; …

Python高效編程技巧

摘要&#xff1a;作者有多年的Python編程經驗&#xff0c;并且有很多的編程小技巧和知識&#xff0c;其中大多數是通過閱讀很流行的開源軟件&#xff0c;如Django, Flask, Requests中獲得的。 我已經使用Python編程有多年了&#xff0c;即使今天我仍然驚奇于這種語言所能讓代碼…

quartz 任務調試 建表 sql 語句、create table語句

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS; DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS; DROP TABLE IF EXISTS QRTZ_SCHEDUL…

關于ttk的使用與安裝

ttk是tkinter中的子模塊&#xff0c;在python2.x中是作為獨立模塊。但是在python3.x中則是成為了tkinter的子模塊&#xff0c;因此調用時&#xff0c;轉變為 from Tkinter import ttk

SEO藝術

SEO藝術 編輯推薦 在本書中&#xff0c;四位搜索引擎優化&#xff08;SEO&#xff09;領域最受矚目的專家闡述了制訂以及執行一個完善的SEO策略時應遵循的一些實用指南與最新技術。 基本信息 原書名&#xff1a; The Art of SEO原出版社&#xff1a; OReilly作者&#xff1a; (…

ActiveMQ支持的傳輸協議

連接到ActiveMQ Connector:ActiveMQ提供的&#xff0c;用來實現連接通信的功能。包括:client-to-broker、broker-to-broker。ActiveMQ允許客戶端使用多種協議來進行連接。 client-to-broker模式一般是配置文件中的transportConnector配置 broker-to-broker:一般是指網絡(networ…

http狀態碼301和302詳解及區別

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一直對http狀態碼301和302的理解比較模糊&#xff0c;在遇到實際的問題和翻閱各種資料了解后&#xff0c;算是有了一定的理解。這里記錄下…

哪些編程語言需要修復?

摘要&#xff1a;編程語言有十全十美的嗎&#xff1f;每種語言都有缺陷嗎&#xff1f;這不&#xff0c;Java、C、C、Python都中槍了。語言之間也可相互“掐架”&#xff0c;一起來看下。 原文作者Kevin Kelleher采用一種比較新穎的方式來比較編程語言&#xff1a;即描述每個編程…

時間修改,學習

設定時間格式 import datetime print datetime.datetime.now().strftime("%Y-%m-%d %H:%M") # 2018-05-08 16:54 時間增加 import datetime print (datetime.datetime.now()datetime.timedelta(days1)).strftime("%Y-%m-%d %H:%M:%S") days改為hours m…

Python標準庫

《Python標準庫》基本信息原書名&#xff1a; The Python Standard Library by Example 原出版社&#xff1a; Pearson Education 作者&#xff1a; (美)Doug Hellmann 譯者&#xff1a; 劉熾 出版社&#xff1a;機械工業出版社 ISBN&#xff1a;9787111378105上架時間&#xf…

五種世界頂級思維-20190303

一、墨菲定律&#xff1a; 你越害怕什么&#xff0c;就越會發生什么。 二、吉爾伯特定律&#xff1a;工作中最大的困難就是沒人跟你說如何去做。 三、吉德林法則&#xff1a;把問題清楚的寫下來&#xff0c;就已經成功一半了。 四、沃爾森法則&#xff1a;把信息和金錢排在第一…

狀態碼301和302的區別

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 定義如下&#xff1a; 301 Moved Permanently 被請求的資源已永久移動到新位置&#xff0c;并且將來任何對此資源的引用都應該使用本響應…

Perl迎來25歲生日

摘要&#xff1a;Perl迎來了它的第25歲生日&#xff0c;普天下Perlist都冒泡同慶一下&#xff0c;很多開發者喜歡它的理由是因其具備強力、穩定、成熟、可移植性等特點&#xff0c;Perl的愛好者們趕快送上你的祝福吧&#xff01; 昨天&#xff0c;Perl迎來了它的第25歲生日&…

20165114 《網絡對抗技術》 Exp0 Kali安裝與配置 Week1

目錄&#xff1a; 一、kail的下載與安裝 二、kali的網絡設置 三、安裝vmware-tools。 四、更新軟件源。 五、共享文件夾 六、安裝中文輸入法 一、kail的下載與安裝 VMware workstation的安裝 因為之前的課程已經涉及&#xff0c;所以本機已經安裝好了VMware workstation&#x…

大數據:互聯網大規模數據挖掘與分布式處理

《大數據:互聯網大規模數據挖掘與分布式處理》基本信息原書名&#xff1a;Mining of Massive Datasets作者&#xff1a; (美)拉賈拉曼(Rajaraman,A.) (美)厄爾曼(Ullman,J.D.) [作譯者介紹]譯者&#xff1a; 王斌叢書名&#xff1a; 圖靈程序設計叢書出版社&#xff1a;人民郵電…

pip 切換源安裝

https://pypi.tuna.tsinghua.edu.cn/simple/ # 清華大學 https://mirrors.aliyun.com/pypi/simple/ # 阿里云 https://pypi.douban.com/simple/ # 豆瓣 https://pypi.mirrors.ustc.edu.cn/simple/ # 中國科學技術大學 https://pypi.hustunique.com/ # 華中科技大學 代碼…

String... 參數定義中有三個點的意思

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 有一個方法&#xff1a; protected void addMessage(String... messages) { ... } String... 是指參數的長度是可以變化的&#xff0…

SpringCloud框架搭建+實際例子+講解+系列五

&#xff08;4&#xff09;服務消費者&#xff0c;面向前端或者用戶的服務 本模塊涉及到很多知識點&#xff1a;比如Swagger的應用&#xff0c;SpringCloud斷路器的使用&#xff0c;服務API的檢查、token的校驗&#xff0c;feign消費者的使用。大致代碼框架如下&#xff1a; 先…