链表最合适的替代方案是什么?

What is the most suitable alternative for Linked List?

我正在研究嵌入式 C,OS 中的任务相关实现。我已经实现了 Linked List. Now it needs to minimize the use of pointers to satisfy MISRA C,在我目前的实现中,我正在寻找链接列表的最佳替代方案,在嵌入式 OS 中进行任务操作。

使用结构的静态数组来完全避免指针会很容易(你只需要使用数组索引而不是指针)。这样既有优点也有缺点。

缺点是:

  • 你必须实现自己的分配器(在静态数组中分配和释放 "array elements")

  • 用于数组的内存在不用于链表时不能用于任何其他目的

  • 你必须确定一个"max. number of elements that could possibly be needed"

  • 它和指针有同样的问题。例如。您可以访问已释放的数组元素,多次释放相同的数组元素,使用越界的索引(如果您决定使用 -1 来表示,则包括 NULL 的等价物NULL_ELEMENT), 等等

优点是:

  • 通过实现您自己的分配器,您可以避免由 malloc() 引起的错误,包括(例如)在释放它时检查某些东西是否已经释放并返回错误而不是丢弃你的自己的元数据

  • 分配通常可以是simpler/faster,因为你一次只有allocating/freeing一个"thing"(数组元素),不用担心关于 allocating/freeing 一次可变数量的连续 "things"(字节)

  • 列表中的条目更有可能(在内存中)彼此更接近(不像 malloc() 那样你的条目分散在你分配的所有其他东西中),这可以提高性能(缓存位置)

  • 您有一个 "max. number of elements that could possibly be needed" 可以更轻松地追踪(例如)内存泄漏等问题;并且(在内存有限的情况下)可以更轻松地确定最坏情况下的内存占用量

  • 它满足毫无意义的要求(如"no pointers")尽管没有避免这些要求旨在避免的任何事情

Now it needs to minimize the use of pointers to satisfy MISRA C

我曾经和一些嵌入式工程师一起工作。他们构建了低端(和高端)路由器和网关。他们没有动态分配内存,而是使用在启动时提供的固定缓冲区。然后他们将索引跟踪到已配置的缓冲区数组中。

静态数组和索引需要 Cursor 数据结构。您的第一个搜索结果是 Cursor Implementation of Linked Lists from C++ 中的数据结构和算法分析,第 2 版。马克·韦斯。 (实际上我几年前在大学里用过那本书)。