我正在开发一个具有高性能和内存需求的应用程序。我的意思是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
中的副本将使用已删除的内存。有没有办法在不调用析构函数的情况下删除旧数组?
答案 0 :(得分:8)
将您的memcpy
替换为:
std::move(array, array + _size, newArray);
并要求类型ArrType
必须具有正确的移动或复制赋值运算符。
但在现实生活中,只需使用vector<ArrType>
。
实际上vector
比这更好:而不是分配一个数组(如果类型有一个运行构造函数),然后移动分配(覆盖new
刚刚执行的操作)它分配原始内存,然后使用移动构造函数和placement new。
所以,如果你绝对肯定需要vector
版本使用size_type
的较小类型而不是实现版本,我想要做的就是重新实现vector
在这个改变的新名称下。您可以使用实施中的源来帮助您:这样您就可以在此面前解决此问题以及所涉及的所有其他问题。