Mil*_*mek 1 c++ arrays destructor memory-management c++11
我正在开发一个具有高性能和内存需求的应用程序.我的意思是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;
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,非常标准的重新分配,但我进行了测试memcpy
,它比使用for
循环快了大约10倍.问题是当我调用时delete
,它会调用析构函数来获取对象ArrType
,这在ArrType
有自己的动态分配时就会出现问题.副本newArray
将使用已删除的内存.有没有办法删除旧数组而不调用析构函数?
替换你memcpy
:
std::move(array, array + _size, newArray);
Run Code Online (Sandbox Code Playgroud)
并要求该类型ArrType
必须具有正确的移动或复制赋值运算符.
但在现实生活中,只需使用vector<ArrType>
.
实际上vector
比这更好:而不是分配一个数组(如果类型有一个运行构造函数)然后移动分配(覆盖new
刚才做的)它分配原始内存然后使用移动构造函数与placement new .
所以,如果你绝对肯定需要一个版本vector
使用size_type
比实现中的类型更小的类型,我想要做的是用vector
一个新名称重新实现该更改.您可以使用实施中的源来帮助您:这样您就可以在此面前解决此问题以及所涉及的所有其他问题.