1
我在此示例代码来说明我的问题:是否有可能在其本身之前有效地重新分配数据?
/**
* begin end
* v v
* XXXXXXXXXXXXXXXX
*^
* data
* [===========] size
* [==============] capacity
*/
typedef struct list_t
{
int *data;
int *begin;
int *end;
size_t size;
size_t capacity;
} list_t;
/**
* begin end
* v v
* XXXXXXXXXXXXXXXX
*^
* old_data
*
* becomes
*
* begin end
* v v
* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
*^
* data
*/
void reserve_back(list_t *this) {
int *old_data = this->data;
this->capacity *= 2;
this->data = (int *) realloc(this->data, this->capacity * sizeof(int));
if (old_data != this->data) {
this->begin = this->begin - old_data + this->data;
this->end = this->end - old_data + this->data;
}
}
/**
* begin end
* v v
* XXXXXXXXXXXXXXXX
*^
* old_data
*
* becomes
*
* begin end
* v v
* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
*^
* data
*/
void reserve_front(list_t *this) {
int *old_data = this->data;
this->data = (int *) malloc(this->data, this->capacity * sizeof(int) * 2);
memmove(this->data + this->capacity, old_data, this->capacity * sizeof(int));
free(old_data);
this->capacity *= 2;
this->begin = this->begin - old_data + this->data;
this->end = this->end - old_data + this->data;
}
list_t基本上是一个双端动态阵列上两端在恒定的时间,以及通常的随机接入提供推入和弹出操作。
当我需要增加后面的容量时,我可以使用realloc来重新分配数据块,而realloc只在必要时移动数据。然而,为了增加前端的容量,我不得不每次都移动数据,这在大型列表中可能变得非常沉重。
当已经分配的数据之前有可用内存时,是否有任何方法可以在恒定时间内进行这种重新分配?
感谢您的答案,我想我会尝试实施它的细分市场,并有一个成员连续复制,可以更新。什么是合理的细分市场规模?它应该是相对于所存储类型的大小,还是应该是一个常量? – Siapran 2015-03-25 07:49:53