我正在研究嵌入式 C,OS 中与任务相关的实现。我已经实现了Linked List。现在它需要最小化指针的使用以满足MISRA C,在我目前的实现中,我正在为任务操作在嵌入式操作系统中寻找链接列表的最佳替代方案。
2 回答
使用结构的静态数组来完全避免指针很容易(您只需使用数组索引而不是指针)。这既有优点也有缺点。
缺点是:
您必须实现自己的分配器(在静态数组中分配和释放“数组元素”)
用于数组的内存在不用于链表时不能用于任何其他目的
您必须确定“可能需要的最大元素数”
它和指针有同样的问题。例如,您可以访问一个已释放的数组元素,多次释放同一个数组元素,使用超出范围的索引(包括
NULL
如果您决定执行类似使用-1
表示的操作NULL_ELEMENT
)等。
优点是:
通过实现自己的分配器,您可以避免由 引起的错误
malloc()
,包括(例如)在释放某些东西时检查它并返回错误而不是丢弃您自己的元数据分配通常可以更简单/更快,因为您一次只分配/释放一个“事物”(数组元素),并且不需要担心分配/释放可变数量的连续“事物”(字节)一次
您列表中的条目更有可能彼此更接近(在内存中)(不像
malloc()
您的条目分散在您分配的所有其他内容中),这可以提高性能(缓存位置)你有一个“可能需要的最大元素数量”,以便更容易追踪诸如(例如)内存泄漏之类的问题;和(在内存有限的情况下)更容易确定最坏情况下的内存占用
尽管没有避免任何这些要求旨在避免的事情,但它满足了毫无意义的要求(如“无指针”)
现在它需要最小化指针的使用以满足 MISRA C
我曾经和一些嵌入式工程师一起工作。他们构建了低端(和高端)路由器和网关。他们不是动态分配内存,而是使用启动时提供的固定缓冲区。然后,他们将索引跟踪到预置缓冲区数组中。
静态数组和索引需要 Cursor 数据结构。您的第一个搜索结果是C++ 中数据结构和算法分析中链接列表的游标实现,第 2 版。通过马克韦斯。(我实际上在大学几年前就用过那本书)。