C++ 平面数组与多维数组内存占用

标签 c++ memory memory-management destructor

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

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

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

最佳答案

如果你这样做:

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

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

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

只是因为你所说的原因。

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

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

关于C++ 平面数组与多维数组内存占用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17518396/

相关文章:

c++ - 容器的 Qt 内存管理

c++ - ODBC 调用 SQLFetch 与 SQLFetchScroll

c++ - 切换大小写拒绝将常量识别为已初始化

c++ - 条件随机场 (CRF) 实现/库

iphone - 内存泄漏工具告诉我零泄漏,但内存占用量不断增加

java 空闲内存使用情况

c++ - 如何在内存中存储 double

Android 堆大小限制,我们真的还需要在设计应用程序时牢记 16 MB 的限制吗?

c++ - C/C++ 模式到 USE_HEAP 或 USE_STACK

c++ - 两个瓦片之间的瓦片 map 冲突解决