• Linux 内核源代码的几个C语言技巧


    1.#define中使用do{statement}while(0)
    保证statement无论在何处都能正确执行一次
    2.将链表操作抽象出来,与宿主结果相互独立。所有的链表操作都作用与list_head,然后通过宏
    #define list_entry(ptr, type, member) 
    container_of(ptr, type, member)
    获取宿主结构的地址.

    container_of定义:

    #define container_of(ptr, type, member) ({
    const typeof(((type *)0)->member) *__mptr = (ptr);
    (type *)((char *)__mptr - offsetof(type, member)); })

    很精辟,效率也很高,比后来的C++的面向对象的ADT效率高。

    3.当一个数据结构被多个“用户”(此处用户指使用数据结构的一切对象)使用时,在内核中实际上只需要分配一个就行了,每个用户只需将指针指这个数据结构就行了。分配函数中,如果此结构还不存在就分配一个,初始化其引用计数器为1,如果存在的话,只需简单地将引用计数器加1就行了。析构函数中,只需将引用计数器减1,如果减到0再释放内存空间。这种技巧的核心在于利用指针实现内存的共享,而内存本身采用引用计数器来记录引用次数。这样可以极大节省空间。 这个技巧貌似在Windows内核中也有使用。

    4.使用likely和unlikely来指导gcc对代码进行分支预测的优化。二者的定义为:

    #define likely(x) __builtin_expect((x),1)
    #define unlikely(x) __builtin_expect((x),0)

  • 相关阅读:
    Java如何让线程池满后再存放队列
    Java如何让线程池满后再存放队列
    Hystrix 中线程池隔离与信号量隔离区别
    微服务中服务间feign调用header传参
    JVM 垃圾收集器
    java对象引用与垃圾收集器回收算法
    JVM 中 java 对象布局
    类加载器与双亲委派机制
    sql 查询本周周一与周日时间
    VUE组件循环引用
  • 原文地址:https://www.cnblogs.com/yezuhui/p/6836442.html
Copyright © 2020-2023  润新知