Linux内核数据结构

pvabu6sv  于 2022-10-04  发布在  Linux
关注(0)|答案(2)|浏览(192)

我是模块编写新手,需要一个循环缓冲区[1]和一个向量。由于Linux内核显然提供了一些数据结构(lib)(列表、树),我想知道是否有向量等价

虽然我认为我有很好的能力编写自己的代码,但我更喜欢这样的库,以防止代码重复和避免错误。

[1]撰写问题kfifo时发现,也可能需要Queues in the Linux Kernel

fnatzsnv

fnatzsnv1#

据我所知,直到4.1Linux内核才有向量的实现。而且没有任何意义,因为向量可以用Linux内核中已经提供的实现的基本数据结构来设计。

ymdaylpp

ymdaylpp2#

我来得有点晚,但如果有人需要用C实现广义向量,可以在初始化时使用空指针和sizeof运算符来完成。它应该看起来像这样:

struct MyVec {
  void *data;
  size_t stored_sizeof;
  size_t size;
  size_t allocated_size
};

# define STARTING_ALLOCATED_SIZE 10

void MyVec_init(struct MyVec *self, size_t sizeof_data_type) {
  self->stored_sizeof = sizeof_data_type;
  self->data = malloc(self->stored_sizeof * STARTING_ALLOCATED_SIZE);
  self->size = 0;
  self->allocated_size = STARTING_ALLOCATED_SIZE;
}

void MyVec_deinit(struct MyVec *self) {
  free(self->data);
}

bool MyVec_at(struct MyVec *self, size_t index, void *to_fill) {
  if (index >= size)
    return false;

  memcpy(to_fill, self->data + (index * self->stored_sizeof), self->stored_sizeof);
  return true;
}

以及您可能需要的所有其他方法,只要确保在索引、添加/删除元素等时使用stored_sizeof即可。

相关问题