【问题标题】:Deleting array without calling destructors删除数组而不调用析构函数
【发布时间】: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


【解决方案1】:

将您的 memcpy 替换为:

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

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

但在现实生活中,只需使用vector&lt;ArrType&gt;

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

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

【讨论】:

  • 是的,这就是我要做的——重新实现向量,以便在需要时可以互换。我已经在大小为 1000000 的数组上测试了与循环相反的移动功能的速度。它在大约 2000 个时钟内完成了这项工作。周期花费了 11000。所以它确实达到了预期的效果。谢谢。
猜你喜欢
  • 2021-04-10
  • 2012-03-13
  • 1970-01-01
  • 2013-09-30
  • 2015-01-15
  • 2014-12-27
  • 2011-11-05
  • 2017-08-28
  • 2010-11-25
相关资源
最近更新 更多