日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2025/3/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对话Linus Torvalds:大多黑客甚至连指针都未理解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

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

他說(shuō):

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

if (prev) prev->next = entry->next; else list_head = entry->next;

????每當(dāng)我看到這些的代碼,我會(huì)說(shuō):“此人不了解指針”。這還是一個(gè)可悲的、常見(jiàn)的問(wèn)題。

????如果開(kāi)發(fā)者能夠理解指針,只需要使用“指向該條目的指針”并初始化list_head,然后貫穿列表,此時(shí)無(wú)需使用任何條件語(yǔ)句即可刪除該條目,只需通過(guò) *pp = entry->next。

????我想我理解指針,但不幸的是,如果要實(shí)現(xiàn)刪除函數(shù),我會(huì)一直保持跟蹤前面的列表節(jié)點(diǎn)。這里是代碼草稿:

不理解指針的人做法:

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; }

????這個(gè)鏈表很簡(jiǎn)單,但可以把每個(gè)節(jié)點(diǎn)的指針和sentinel值構(gòu)建成了一個(gè)完美的結(jié)構(gòu)體,但是修改這個(gè)表的代碼需要很精妙。難怪鏈表功能會(huì)常出現(xiàn)在許多面試環(huán)節(jié)中。

????上面執(zhí)行的代碼是處理從列表頭中刪除任何節(jié)點(diǎn)所需的條件。

????現(xiàn)在,讓我們好好記住Linus Torvalds執(zhí)行代碼。在這種情況下,我們通過(guò)一個(gè)指針指向列表頭來(lái)貫穿列表遍歷修改。

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; } }

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

????改進(jìn)版的remove_if()是一個(gè)使用雙重星號(hào)的例子,雙重星號(hào)象征著兩重間接尋址,再加一個(gè)星(third star)又會(huì)太過(guò)多余。

轉(zhuǎn)載于:https://my.oschina.net/chenshouyong/blog/101447

總結(jié)

以上是生活随笔為你收集整理的对话Linus Torvalds:大多黑客甚至连指针都未理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。