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

时间:2015-09-28 03:59:12

标签: c linked-list embedded misra autosar

我正在研究嵌入式C,OS中与任务相关的实现。我已经实现了Linked List。现在它需要最小化指针的使用以满足MISRA C,在我目前的实现中,我正在搜索嵌入式操作系统中用于任务操作的链接列表的最佳替代方案。

2 个答案:

答案 0 :(得分:2)

使用静态结构数组来完全避免指针很容易(你只使用数组索引而不是指针)。这有利有弊。

缺点是:

  • 你必须实现自己的分配器(在静态数组中分配和释放“数组元素”)

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

  • 您必须确定“可能需要的最大元素数量”

  • 它与指针有着同样的问题。例如。您可以访问已释放的数组元素,多次释放相同的数组元素,使用超出范围的索引(如果您决定执行类似使用NULL的操作,则使用相当于-1的索引NULL_ELEMENT)等。

优点是:

  • 通过实现自己的分配器,您可以避免malloc()导致的错误,包括(例如)在释放错误并返回错误而不是丢弃您自己的元数据时检查某些内容尚未释放

  • 分配通常可以更简单/更快,因为您一次只分配/释放一个“事物”(数组元素),而不必担心分配/释放可变数量的连续“事物“(字节)一次

  • 列表中的条目更可能彼此更接近(在内存中)(与malloc()不同,其中您的条目分散在您分配的所有其他内容中),这可以提高性能(缓存)局部性)

  • 你有一个“可能需要的最大数量的元素”,以便更容易追踪(例如)内存泄漏等问题; (在内存有限的情况下)可以更容易地确定最坏情况下的内存占用

  • 它满足了无意义的要求(比如“无指针”),尽管没有避免任何这些要求是为了避免这些要求

答案 1 :(得分:1)

  

现在需要尽量减少使用指针来满足MISRA C

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

Cursor数据结构的静态数组和索引。您的首次搜索匹配是Cursor Implementation of Linked Lists from Data Structures and Algorithm Analysis in C++, 2nd ed. by Mark Weiss。 (我实际上在大学时代曾经使用过那本书)。