1

在 C++ 中,delete[]运算符删除一个数组。它能够访问数组的长度,因为分配器会跟踪它。

这是否意味着扁平的一维数组比多维数组占用更少的内存?

更具体地说,如果我 allocate Object** c,分配器是否存储第一维和第二维的长度,而分配Object* c(但与二维数组具有相同数量的元素)仅存储一个长度?

4

1 回答 1

2

如果你这样做:

Object **c = new Object*[n];
for (size_t i=0; i!=n; ++i) {
  c[i] = new Object[m];
}

那么它通常会比这样做需要更多的内存:

Object *c = new Object[n*m];

仅出于您所说的原因。

每个内存分配都有一定的开销。除了需要保持元素的数量外,内存分配器本身还有开销。每行的所有额外指针也需要更多内存。

请注意,可能会出现分解它会使用更少内存的情况。如果你的堆是碎片的,那么找到一大块内存可能需要从操作系统分配更多的内存,而如果你的数组被分成更小的部分,这些部分可能能够放入碎片堆的孔中。

于 2013-07-08T02:34:54.053 回答