c-在堆栈与堆上使用链表实现的原因



我在C中查看了一些系统编程类的库,注意到它们对双链表的实现不需要动态分配数据。相反,一个潜在动态分配结构的列表需要一个嵌入的列表元素,该元素通过list_entry宏将任何列表元素转换回存储的结构。例如,给定一个structfoo:

struct list_elem
{
struct list_elem *prev; 
struct list_elem *next; 
};
struct list
{
struct list_elem head; 
struct list_elem tail; 
};
struct list foo_list;
list_init(&foo_list);
...
struct list_elem *e = list_begin(&foo_list); 
struct foo *f = list_entry(e, struct foo, sharedelem);  // Where sharedelem is of list_elem in struct foo

我的问题是,这在系统编程之外是否有利和/或适用?或者使用链表的不明确类型实现是可取的(其中链表本身是malloc’ed并指向void元素(。

有两种情况:

  1. 程序/库/服务拥有数据,并且不共享数据。在这种情况下,出于速度和内存占用的原因,更改内部数据结构以支持不同类型的访问/遍历(链表、树等(可能是有利的。但是,该数据不应泄露到程序/库/服务的客户端,因为客户端代码可能会扰乱内部(最终会对所有潜在客户端造成影响(。

  2. 程序/库/服务代表客户端处理客户端的数据,因此与客户端代码共享。在这种情况下,用于访问/遍历客户端数据的结构必须";"包裹";围绕它,而不更改客户端的数据。这是因为客户端代码假定来自容器的数据持久性;我给了你一个int,我希望得到一个值相同的int;。

我希望这两个案例能够解释为什么这两种方法都有优点,具体取决于业务案例。

最新更新