我正在从事嵌入式C,任务相关的操作系统实现。我已经实现了链表。现在它需要最大限度地减少指针的使用,以满足MISRA C,在我目前的实现中,我正在寻找链表的最佳替代方案,在嵌入式操作系统中用于任务操作。
使用静态结构数组来完全避免指针是很容易的(您只需使用数组索引而不是指针)。这既有优点也有缺点。
缺点是:
-
你必须实现你自己的分配器(在静态数组中分配和释放"数组元素")
-
用于数组的内存不能用于任何其他目的,当它不被用于链表
-
你必须确定一个"最大值"。可能需要的元素数量
-
它有和指针一样的问题。例如,你可以访问一个被释放的数组元素,多次释放同一个数组元素,使用一个越界的索引(包括
NULL
的等价物,如果你决定用-1
来代表NULL_ELEMENT
),等等。
优点是:
-
通过实现您自己的分配器,您可以避免
malloc()
引起的错误,包括(例如)检查某些东西在释放它时不是已经自由并返回错误,而不是丢弃您自己的元数据 -
分配通常可以更简单/更快,因为你一次只分配/释放一个"东西"(数组元素),而不需要担心一次分配/释放可变数量的连续"东西"(字节)
-
列表中的条目更有可能彼此更接近(在内存中)(不像
malloc()
,您的条目分散在您分配的其他所有内容中),这可以提高性能(缓存局域性) -
你有一个"最大值"。"可能需要的元素数量",以便更容易追踪诸如(例如)内存泄漏之类的问题;和(在内存有限的情况下)更容易确定最坏情况下的内存占用
-
它满足毫无意义的要求(如"无指针"),尽管没有避免任何这些要求旨在避免
现在它需要最小化指针的使用来满足MISRA C
我曾经和一些嵌入式工程师一起工作。他们制造低端(和高端)路由器和网关。它们使用的不是动态分配内存,而是在引导时提供的固定缓冲区。然后将索引跟踪到已配置的缓冲区数组中。
静态数组和索引需要游标数据结构。您的第一个搜索命中是光标实现链表来自c++中的数据结构和算法分析,Mark Weiss第2版。