Linux 内核源代码的几个C语言技巧
2017-05-10 16:04
211 查看
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)
保证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)
相关文章推荐
- Linux 内核源代码的几个C语言技巧
- linux 内核源代码情景分析——几个重要的数据结构和函数
- Linux内核中C语言使用特点和技巧
- linux 内核源代码情景分析——linux 内核源代码中的C语言代码
- linux内核代码阅读的几个技巧
- linux、内核源代码的阅读
- 几个关于Linux自定义内核的文章
- Linux 内核源代码的结构
- LINUX系统下grub菜单的几个技巧
- linux 内核源代码学习
- Linux内核入门(三)—— C语言基本功
- LINUX0.11内核KERNEL包(内核代码)中的几个重要的文件分析
- 几个重要的Linux系统内核文件介绍
- linux 内核源代码目录结构概述
- 几个重要的Linux系统内核文件介绍
- Linux 任务控制的几个技巧( &, [ctrl]-z, jobs, fg, bg, kill)
- linux0.11内核源代码学习-引导启动
- Linux 内核源代码漫游
- linux内核查找和源代码下载
- 几个重要的Linux系统内核文件介绍