为队列设计一个调整大小的函数
Designing a resize function for a queue
我目前正在尝试为队列数据结构设计一个 public API 和调整大小函数来改变它的大小。我的初衷是按以下方式进行:
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
的合同,内容如下:
The realloc
function returns a pointer to the new object (which
may have the same value as a pointer to the old object), or
a null pointer if the new object could not be allocated.
重新分配函数 return 新对象并回收旧对象是否是一种常见的方法?因此,在这种情况下,我应该重新设计 int queue_resize(queue *queue_ptr, size_t);
以使 queue * queue_resize(queue *queue_ptr, size_t);
具有相应的合同更改。
realloc
必须能够将分配的 space 移动到不同的地址才能工作。想象一下当前分配的内存已经被使用之后的内存。如果没有重定位,您将无法创建连续序列。
通常您的队列看起来像这样
typedef struct queue {
some_type* data_member;
size_t size;
size_t capacity;
// .. perhaps more
} queue;
所以当你有一个 queue_resize
函数时,你可以只传递一个 queue*
和新的大小。您传递给 realloc
的不是 queue*
,而是它的 data_member
。由于您已经有一个指向 queue
对象的指针,如果 realloc
选择更改它,您可以只更新 data_member
的指针。
在这种情况下,不需要返回一个新的 queue*
对象,因为 queue
的内存占用量永远不会改变。您也不必传递 queue**
或任何类似的东西。
上一个answers/comments不解决数据怎么办。考虑一下当 Java 运行 时间发现数组需要更大时在 Java 中做了什么。例如。您尝试将一个元素附加到一个已经满的数组。
- 一个新的数组被分配了所需的大小;这包括设置元数据
- 必须设置一个锁,这样旧数组就不会改变
- 所有数据从现有数组复制到新数组;包括更新元数据;请注意,这两个数组需要同时存在
- 原来的数组被删除了(不确定这里的词是否正确。)
- 锁被移除
- 如果你只是 fiddle 使用指针,你会丢失数据。
- 您可以使用 Add() 和 Remove() 等标准方法轻松复制数据
我目前正在尝试为队列数据结构设计一个 public API 和调整大小函数来改变它的大小。我的初衷是按以下方式进行:
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
的合同,内容如下:
The
realloc
function returns a pointer to the new object (which may have the same value as a pointer to the old object), or a null pointer if the new object could not be allocated.
重新分配函数 return 新对象并回收旧对象是否是一种常见的方法?因此,在这种情况下,我应该重新设计 int queue_resize(queue *queue_ptr, size_t);
以使 queue * queue_resize(queue *queue_ptr, size_t);
具有相应的合同更改。
realloc
必须能够将分配的 space 移动到不同的地址才能工作。想象一下当前分配的内存已经被使用之后的内存。如果没有重定位,您将无法创建连续序列。
通常您的队列看起来像这样
typedef struct queue {
some_type* data_member;
size_t size;
size_t capacity;
// .. perhaps more
} queue;
所以当你有一个 queue_resize
函数时,你可以只传递一个 queue*
和新的大小。您传递给 realloc
的不是 queue*
,而是它的 data_member
。由于您已经有一个指向 queue
对象的指针,如果 realloc
选择更改它,您可以只更新 data_member
的指针。
在这种情况下,不需要返回一个新的 queue*
对象,因为 queue
的内存占用量永远不会改变。您也不必传递 queue**
或任何类似的东西。
上一个answers/comments不解决数据怎么办。考虑一下当 Java 运行 时间发现数组需要更大时在 Java 中做了什么。例如。您尝试将一个元素附加到一个已经满的数组。
- 一个新的数组被分配了所需的大小;这包括设置元数据
- 必须设置一个锁,这样旧数组就不会改变
- 所有数据从现有数组复制到新数组;包括更新元数据;请注意,这两个数组需要同时存在
- 原来的数组被删除了(不确定这里的词是否正确。)
- 锁被移除
- 如果你只是 fiddle 使用指针,你会丢失数据。
- 您可以使用 Add() 和 Remove() 等标准方法轻松复制数据