zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    HLG 1522 子序列的和【队列的应用】
    POJ 3273 Monthly Expense【二分】
    HDU 4004 The Frog's Games 【二分】
    POJ 2001 Shortest Prefixes【第一棵字典树】
    POJ 2823 Sliding Window【单调对列经典题目】
    HDU 1969 Pie 【二分】
    POJ 3125 Printer Queue【暴力模拟】
    POJ 3250 Bad Hair Day【单调栈】
    字典树【模板】
    验证码 Code
  • 原文地址:https://www.cnblogs.com/yezuhui/p/6836442.html
Copyright © 2011-2022 走看看