博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对话Linus Torvalds:大多黑客甚至连指针都未理解
阅读量:4110 次
发布时间:2019-05-25

本文共 2029 字,大约阅读时间需要 6 分钟。

摘要:Linus Torvalds坦言那些狡诈的通过文件名查找高速缓存,然后又抱怨自己能力一般的内核“恶魔”才是他欣赏的;相反,很多人连低水平的内核编程都还没学好。

几周前, 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()是一个使用双重星号的例子,双重星号象征着两重间接寻址,再加一个星()又会太过多余。

转载地址:http://wposi.baihongyu.com/

你可能感兴趣的文章
维吉尼亚之加解密及破解
查看>>
TCP/IP协议三次握手与四次握手流程解析
查看>>
PHP 扩展开发 : 编写一个hello world !
查看>>
inet_ntoa、 inet_aton、inet_addr
查看>>
用模板写单链表
查看>>
链表各类操作详解
查看>>
C++实现 简单 单链表
查看>>
数据结构之单链表——C++模板类实现
查看>>
Linux的SOCKET编程 简单演示
查看>>
Linux并发服务器编程之多线程并发服务器
查看>>
C语言内存检测
查看>>
Linux epoll模型
查看>>
Linux系统编程——线程池
查看>>
Linux C++线程池实例
查看>>
c++11 你需要知道这些就够了
查看>>
c++11 你需要知道这些就够了
查看>>
shared_ptr的一些尴尬
查看>>
C++总结8——shared_ptr和weak_ptr智能指针
查看>>
c++写时拷贝1
查看>>
Linux网络编程---I/O复用模型之poll
查看>>