1

我正在开发具有高性能和内存需求的应用程序。我的意思是 80 个内核和 500 GB 的 RAM。为了节省一些内存,我使用我自己的动态数组(16 B 开销)而不是std::vector(24 B 开销),如果你有数十亿个,这很重要。我的问题与扩展该数组有关,如下所示:

//private
template <class ArrType>
void DynamicArray<ArrType>::reallocate(unsigned newCapacity) {
    if (newCapacity < _size) return;
    if (capacity == newCapacity) return;

    ArrType * newArray = new ArrType[newCapacity];
    capacity = newCapacity;

    //for (unsigned i = 0; i < _size; i++) {
    //    newArray[i] = array[i];
    //}

    memcpy(newArray, array, _size * sizeof(ArrType));

    if(array) delete [] array;
    array = newArray;
}

如您所见,非常标准的重新分配,但我测试过memcpy,它比使用for循环快 10 倍。问题是当我调用 时delete,它会调用 的对象的析构函数,这在有自己的动态分配ArrType时是个问题。ArrType复制newArray将使用已删除的内存。有什么方法可以在不调用析构函数的情况下删除旧数组?

4

1 回答 1

8

将您的替换memcpy为:

std::move(array, array + _size, newArray);

并要求该类型ArrType必须具有正确的移动或复制赋值运算符。

但在现实生活中,只需使用vector<ArrType>.

事实上vector比这更好:而不是分配一个数组(如果类型有一个则运行构造函数)然后移动分配(覆盖new刚刚所做的)它分配原始内存,然后使用带有放置新的移动构造函数.

所以,如果你绝对肯定需要一个版本,vector它使用size_type比你的实现中更小的类型,我想要做的事情就是vector在一个新名称下重新实现这个更改。你可以在你的实现中使用源代码来帮助你:这样你就可以在你面前解决这个问题和所有其他涉及的问题。

于 2013-11-05T13:31:34.313 回答