sys/queue.h
首先出现在4.4BSD中。 Linux已经将它包含在它的发行版中,但版本看起来不是最新的。
FreeBSD版本实现了单链表,单链尾列,列表和尾列。 Linux版本实现列表,尾部队列和循环队列。
我在我的Ubuntu PC中安装了libbsd-dev软件包,然后在/usr/include/bsd/sys/queue.h
find了BSD版本的sys/queue.h
。
我的问题:
我在哪里可以find这个头文件的Linux版本?
这两个实现之间的主要区别是什么? Linux版本只是BSD的过时版本吗?
他们有着相同的祖先,但是看起来好像他们已经做的任何事情发展很久以前都是分歧的。
如果你想在你的项目中使用它,最好的办法就是把你最喜欢的那个复制到你的项目中并使用它。 不要依赖提供给你的系统。 这只是一个带有一堆宏的头文件,不需要库或任何依赖项来工作,因此根本不是操作系统特定的。 我通常从我的项目采取OpenBSD的。
看起来Linux的版本严重过时。 自2001年以来,CIRCLEQ(相当强烈地)在BSD中被弃用,即使实现仍在queue.h中,它甚至被从文档中移除。 我们应该使用TAILQ,它提供了相同的功能,具有更好的性能/更少的问题/更好的实现。
同时,在Linux中,甚至还有文档记录,但是您可以在kconfig中找到从CIRCLEQ迁移到TAILQ的更改,引用BSD弃用。
在CIRCLEQ中的具体问题似乎是它使用了一个特定的头,不同于一个列表节点,但无论如何链接为一个节点; 所以头指针必须保持在每个节点访问周围,并检查节点是否是头。 所以存在两个问题:每次访问时的检查,以及需要将头指针保持在手,取寄存器或缓存。