加入收藏 | 设为首页 | 会员中心 | 我要投稿 通化站长网 (https://www.0435zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Linux 内核源代码的几个C语言方法

发布时间:2021-11-24 12:36:09 所属栏目:教程 来源:互联网
导读:1.#define中使用do{statement}while(0) 保证statement无论在何处都能正确执行一次 2.将链表操作抽象出来,与宿主结果相互独立。所有的链表操作都作用与list_head,然后通过宏 #define list_entry(ptr, type, member) container_of(ptr, type, member) 获取
1.#define中使用do{statement}while(0)
保证statement无论在何处都能正确执行一次
2.将链表操作抽象出来,与宿主结果相互独立。所有的链表操作都作用与list_head,然后通过宏
#define list_entry(ptr, type, member)
container_of(ptr, type, member)
获取宿主结构的地址,以前版本的linux的定义稍有不同,不过更能体现精髓:
#define list_entry(ptr, type, member)
((type *)((char *)(ptr)(
unsigned long)(&((type *)0)>
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)
 
 

(编辑:通化站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!