设计队列的调整大小功能

时间:2019-04-20 10:25:50

标签: c api-design software-design memory-reallocation

我目前正在尝试为队列数据结构设计公共API,并调整大小函数以更改其大小。我的初衷是通过以下方式做到这一点:

react, redux

问题是我读了typedef struct queue queue; /** * Resizes a given queue. * * Changes the size of the queue passed as a parameter. * The content of the resized queue prior to the lesser * of new and old sizes is left unchanged. * * Returns: * 0 - on success * -1 - on error and the content of the original queue is left unchanged */ int queue_resize(queue * queue_ptr, size_t new_size); 的合同,内容如下:

  

realloc函数返回一个指向新对象的指针(   可能与指向旧对象的指针具有相同的值),或者   如果无法分配新对象,则为空指针。

重新分配函数返回新对象并回收旧对象是一种通用方法吗?因此,在这种情况下,我应该重新设计realloc以使int queue_resize(queue *queue_ptr, size_t);进行相应的合同更改。

2 个答案:

答案 0 :(得分:3)

realloc必须能够将分配的空间移动到其他地址,这样它才能正常工作。想象一下在当前分配的内存已在使用之后的内存。没有重定位,您将无法创建连续的序列。

通常,您的队列看起来像这样

typedef struct queue {
  some_type* data_member;
  size_t size;
  size_t capacity;
  // .. perhaps more
} queue;

因此,当您拥有一个queue_resize函数时,您只需传递一个queue*和新的大小即可。您传递给realloc的不是queue*,而是它的data_member。由于您已经有一个指向queue对象的指针,因此,如果data_member选择对其进行更改,则只需更新realloc的指针。

在这种情况下,无需返回新的queue*对象,因为queue的内存占用量不会改变。您也不必传递queue**或类似的任何内容。

答案 1 :(得分:2)

先前的答案/评论未解决如何处理数据。考虑当Java运行时发现Array需要更大时,用Java做什么。例如。您尝试将元素追加到已经完整的数组中。

  • 以所需大小分配新数组;这包括设置元数据
  • 必须设置一个锁,以使旧的Array不变
  • 将所有数据从现有阵列复制到新阵列;包括更新元数据;请注意,为此需要两个数组同时存在
  • 原始数组已删除(不确定此处的正确单词。)
  • 锁已解除
  • 如果只是摆弄指针,则会丢失数据。
  • 您可以使用Add()和Remove()等标准方法轻松复制数据