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



我正在从事嵌入式C,任务相关的操作系统实现。我已经实现了链表。现在它需要最大限度地减少指针的使用,以满足MISRA C,在我目前的实现中,我正在寻找链表的最佳替代方案,在嵌入式操作系统中用于任务操作。

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

缺点是:

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

  • 用于数组的内存不能用于任何其他目的,当它不被用于链表

  • 你必须确定一个"最大值"。可能需要的元素数量

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

优点是:

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

  • 分配通常可以更简单/更快,因为你一次只分配/释放一个"东西"(数组元素),而不需要担心一次分配/释放可变数量的连续"东西"(字节)

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

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

  • 它满足毫无意义的要求(如"无指针"),尽管没有避免任何这些要求旨在避免

现在它需要最小化指针的使用来满足MISRA C

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

静态数组和索引需要游标数据结构。您的第一个搜索命中是光标实现链表来自c++中的数据结构和算法分析,Mark Weiss第2版。

相关内容

  • 没有找到相关文章

最新更新