一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

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

 arm_embed 2013-01-12

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

發(fā)表于22小時前| 4284次閱讀| 來源CSDN| 23 條評論| 作者夏夢竹

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

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

他說:

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

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

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

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

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

不理解指針的人做法:

  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;  

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

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

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

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

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

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

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    亚洲熟妇av一区二区三区色堂| 欧美成人黄色一区二区三区| 视频一区二区三区自拍偷| 欧美精品久久一二三区| 激情丁香激情五月婷婷| 成年人黄片大全在线观看| 91麻豆精品欧美视频| 一二区不卡不卡在线观看| 日韩女优视频国产一区| 男女午夜视频在线观看免费| 精品国产91亚洲一区二区三区| 91精品国产av一区二区| 精品国产一区二区欧美| 在线观看视频国产你懂的| 国产美女精品午夜福利视频| 亚洲中文字幕免费人妻| 婷婷伊人综合中文字幕| 国产传媒欧美日韩成人精品| 亚洲第一区欧美日韩在线| 国产乱淫av一区二区三区| 午夜精品在线视频一区| 亚洲中文字幕在线观看四区| 日韩精品中文字幕亚洲| 东北老熟妇全程露脸被内射| 精品日韩视频在线观看| 国产偷拍精品在线视频| 日韩欧美一区二区不卡视频| 国产在线成人免费高清观看av| 中文字幕无线码一区欧美| 欧美午夜色视频国产精品| 国产熟女一区二区不卡| 91超精品碰国产在线观看| 欧美激情床戏一区二区三| 午夜日韩在线观看视频| 中文字幕一区久久综合| 日韩在线一区中文字幕| 久久精品国产熟女精品| 久久精品偷拍视频观看| 精品国产成人av一区二区三区| 成人免费高清在线一区二区| 午夜成年人黄片免费观看|