对话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:大多黑客甚至连指针都未理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于MySQL AUTO_INCREME
- 下一篇: 【JAVA资料免费下载】158个JAVA