LibCSTL开发手记

前言
项目地址:https://github.com/jelasin/LibCSTL
移植Linux内核一些优秀的数据结构和算法和一些其他的常用数据结构和算法模板。
Linux Kernel list 移植优化
移植后我们只需要将list_node
定义在你自己的结构体中即可。为了可读性和操作简化,请把list_node
定义在结构体头部,虽然对于list
来说你不把它定义在头部也没有关系。
数据结构
container_of 宏
这是Linux内核中很常用的一个宏定义,配合offsetof
可以轻松根据结构体成员计算出结构体首地址,内核通用链表实现依赖于这个宏。
我么先来看 offsetof
宏:
1 |
|
这个宏用来获取结构体成员的偏移,通过将结构体首地址定义为 0 ,从而获取结构体成员相对于 0 的偏移, 也就是相对于结构体首地址的偏移。
再来看 container_of
宏:
1 |
|
const typeof( ((type *)0)->member ) *__mptr = (const typeof( ((type *)0)->member ) *)(ptr);
用于获取我们传入的成员变量指针的地址,在用他减去他相对于 0 的偏移(相对于结构体首地址的偏移)即可得到结构体的首地址。
表达式语句
container_of 宏使用了表达式语句,这里做一下介绍。
GNU C对C语言标准作了扩展,允许在一个表达式里内嵌语句,允许在表达式内部使用局部变量、for循环和
goto
跳转语句。这种类型的表达式,我们称为语句表达式。语句表达式的格式如下。
1 ({a; b; c;})语句表达式最外面使用小括号()括起来,里面一对大括号{}包起来的是代码块,代码块里允许内嵌各种语句。语句的格式可以是一般表达式,也可以是循环、跳转语句。和一般表达式一样,语句表达式也有自己的值。语句表达式的值为内嵌语句中最后一个表达式的值。我们举个例子,使用语句表达式求值。
1
2
3
4
5 int sum = ({
int i;
for(i = 0; i < 10; ++i);
i;
})最后
sum = 10;
list.h
1 |
|
list.c
1 |
|
example
1 |
|
Linux kernel hlist 移植优化
基于kernel list实现单调栈
基于kernel list实现单调队列
基于kernel list实现双端队列
自定义优先级的优先队列
智能排序算法
- Title: LibCSTL开发手记
- Author: 韩乔落
- Created at : 2025-04-02 18:16:19
- Updated at : 2025-04-07 11:48:55
- Link: https://jelasin.github.io/2025/04/02/LibCSTL开发手记/
- License: This work is licensed under CC BY-NC-SA 4.0.