您好,有一段代码使用C / C ++编写的GNU / Linux中的mmap()
,将数据数组写入预先分配的mmap。我不确定我使用的是正确的术语。这些是可变大小的数组,无论底层类型如何,我都使用联合使数据的每个元素很好地适合。每个数据数组都存储一个偏移量(在其他位置不相关),该偏移量可用于访问数据的开头,数组长度也存储在其中。
将每个数据数组添加到支持mmap的缓存时,它会附加到最后写入的数组的末尾位置。这一切都很好。删除或重新分配元素时,我只是在存储mmap偏移量和长度的“指针”中使它无效,然后将另一个新元素写入缓存。
随着元素的更改或删除,缓存不断增长。这是我的问题,在C或C ++中压缩这些无效和过时的数组的最佳方法是什么? (我正在考虑使用C,因为它正在处理原始字节。)请,我只想提出一些建议,以防止数组无效时如何删除和压缩数据,以避免碎片或浪费。我正在寻找最有效的方法。
还请注意,暂时需要GCC 4.4.7,所以我只能使用C99和C ++ 98。
关于我正在做的一小段代码示例,以使您了解如何添加数据:
// Get the offset position in mmap for writing
void *vPtr = reinterpret_cast<void*>(CardCache + getCardCacheFixedDataSize() + offset);
ElementList list;
memcpy(vPtr, &list, sizeof(ElementList));
ElementList *dataPtr = reinterpret_cast<ElementList*>(vPtr);
ElementData *data = reinterpret_cast<ElementData*>(malloc(count*sizeof(ElementData)));
dataPtr->count = (size_t)count;
for (i = 0; i < count; ++i) {
data[i].i = intList[i];
}
memcpy(&dataPtr->data, &data[0], count*sizeof(ElementData));
free(data);
// "point" to the data
currPtr->key = key;
currPtr->offset = offset;
// advance the writing offset to the next position.
cardCacheVarWriteOffset += reqsize;