【发布时间】:2013-11-16 09:24:06
【问题描述】:
我正在开发一个具有高性能和内存需求的应用程序。我的意思是 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 中的副本将使用已删除的内存。有什么方法可以不调用析构函数就删除旧数组?
【问题讨论】:
-
哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇您只关心
vector的 8 个该死字节的占用空间,但不关心所有这些数十亿动态分配的占用空间吗? -
@crashmstr:如果你要学究气,那就是
for声明。否则,“循环”和“循环”都是完美的口语。 -
如果
~ArrType什么都不做,经过优化,delete []将只是 删除指针,否则必须调用~ArrType或你会有内存泄漏。 -
@crashmstr:不要把你的口语术语强加给其他人。唯一肯定的是
for声明。 -
请注意,在您的解决方案中,您构造了“空”
ArrType,您应该查看placement new。
标签: c++ arrays memory-management c++11 destructor